การเพิ่มประสิทธิภาพฐานข้อมูลยังคงเป็นความท้าทายสำคัญสำหรับแอปพลิเคชันสมัยใหม่ โดยเฉพาะอย่างยิ่งเมื่อต้องจัดการกับการดำเนินการ join ที่ซับซ้อน Readyset ซึ่งเป็นชั้นแคชที่ออกแบบมาสำหรับ query latency แบบ sub-millisecond เพิ่งแก้ไขปัญหาคอขวดสำคัญในระบบของพวกเขา: straddled joins ในช่วง cache misses การ join เหล่านี้เกี่ยวข้องกับการกรอง predicates ทั้งสองด้านของการดำเนินการ join ซึ่งสร้างความท้าทายด้านประสิทธิภาพที่วิธีการเพิ่มประสิทธิภาพแบบดั้งเดิมไม่สามารถแก้ไขได้อย่างมีประสิทธิภาพ
![]() |
---|
การเพิ่มประสิทธิภาพฐานข้อมูลใน Readyset การแก้ไขปัญหาด้วย straddled joins |
สาเหตุหลัก: การอ่านข้อมูลมากเกินไป
การตรวจสอบประสิทธิภาพเผยให้เห็นตัวการที่น่าประหลาดใจ ในตอนแรกวิศวกรสงสัยว่าการบีบอัดข้อมูลเป็นคอขวด เนื่องจาก profiling แสดงให้เห็นว่า 30% ของเวลาการทำงานใช้ไปกับการคลายการบีบอัด อย่างไรก็ตาม การเปลี่ยนอัลกอริทึมการบีบอัดเพียงแค่เปลี่ยนปัญหาไปเป็นการอิ่มตัวของ disk I/O ปัญหาที่แท้จริงคือจำนวนข้อมูลที่ไม่จำเป็นมหาศาลที่ถูกอ่านจากที่เก็บข้อมูล
ใน straddled joins ที่มี selectivity ไม่สม่ำเสมอ วิธี hash join แบบเดิมจะประเมินทั้งสองด้านของ join แยกกัน ซึ่งหมายความว่าต้องอ่านตารางเกือบทั้งหมดแม้ว่าด้านหนึ่งจะมีเงื่อนไขที่เลือกได้สูง ตัวอย่างเช่น การค้นหาผู้ใช้หนึ่งคนตามอีเมลในขณะที่กรองคำสั่งซื้อ 90% ตามสถานะ ส่งผลให้ต้องสร้างแถวที่ไม่จำเป็นหลายล้านแถวที่จะถูกทิ้งหลังจากการดำเนินการ join
การลดการใช้ I/O: วิธีการเดิมต้องใช้ ~10K IOPS พร้มกับการใช้งานอุปกรณ์ 80% สำหรับการสืบค้นครั้งเดียว
Index Condition Pushdown: วิธีการที่ฉลาดกว่า
โซลูชันมาจากการใช้งาน Index Condition Pushdown (ICP) ซึ่งเปลี่ยนแปลงวิธีการทำงานของ joins เหล่านี้โดยพื้นฐาน แทนที่จะกรองทั้งสองด้านแยกกัน วิธีการใหม่จะประเมินด้านที่เลือกได้มากกว่าก่อน จากนั้นใช้ผลลัพธ์เหล่านั้นเพื่อสร้างการค้นหาแบบเป้าหมายสำหรับอีกด้านหนึ่ง
กลยุทธ์นี้ใช้ประโยชน์จาก compound indexes อย่างมีประสิทธิภาพ เมื่อค้นหาคำสั่งซื้อที่มีสถานะเฉพาะซึ่งเป็นของผู้ใช้คนใดคนหนึ่ง ระบบสามารถใช้ index บนคอลัมน์ user_id และ status เพื่อดึงเฉพาะแถวที่เกี่ยวข้อง ซึ่งช่วยขจัดความจำเป็นในการสแกนส่วนใหญ่ของตารางและลดการใช้หน่วยความจำอย่างมาก
การเพิ่มประสิทธิภาพหน่วยความจำ: ลดความจำเป็นในการสร้างข้อมูลหลายล้านแถวที่จะถูกทิ้งหลังจากการ join
การยอมรับจากชุมชนและการใช้งานที่คล้ายกัน
ชุมชนฐานข้อมูลได้ยอมรับรูปแบบการเพิ่มประสิทธิภาพนี้ในระบบต่างๆ เอนจิ้นฐานข้อมูลอื่นๆ ได้ใช้งานวิธีการที่คล้ายกัน โดยบางระบบรายงานการปรับปรุงประสิทธิภาพที่เทียบเคียงได้ - จากคิวรีที่ใช้เวลา 6 วินาทีลดลงเหลือ 50 มิลลิวินาที เทคนิคนี้ได้รับการนำมาใช้ภายใต้ชื่อต่างๆ รวมถึง pushdown joins ในบางระบบ แม้ว่าแนวคิดหลักจะยังคงสอดคล้องกันในการใช้งานต่างๆ
เราก็เปลี่ยนจาก 6 วินาทีเป็น 50ms การเพิ่มความเร็วอย่างมาก
นักพัฒนาบางคนสังเกตว่าแม้ว่าคำศัพท์อาจแตกต่างกันระหว่างระบบ แต่หลักการเพิ่มประสิทธิภาพพื้นฐานของการลดการเคลื่อนย้ายข้อมูลที่ไม่จำเป็นและการใช้ indexes อย่างมีประสิทธิภาพมากขึ้นกำลังกลายเป็นวิธีการมาตรฐานสำหรับการจัดการสถานการณ์ join ที่ซับซ้อน
การปรับปรุงประสิทธิภาพ: เร็วขึ้นสูงสุดถึง 450 เท่าสำหรับ straddled join queries
ผลกระทบในโลกจริง
การเพิ่มประสิทธิภาพนี้แก้ไขสถานการณ์ production ทั่วไปที่แอปพลิเคชันต้องกรองข้อมูลข้ามตารางที่เกี่ยวข้องหลายตาราง แพลตฟอร์มอีคอมเมิร์ซ เช่น มักจำเป็นต้องค้นหาผู้ใช้ที่มีคุณสมบัติเฉพาะและคำสั่งซื้อของพวกเขาที่ตรงกับเกณฑ์บางอย่าง วิธีการเดิมจะอ่านข้อมูลที่ไม่เกี่ยวข้องจำนวนมาก ในขณะที่วิธีการใหม่จะกำหนดเป้าหมายเฉพาะเรคอร์ดที่จำเป็นเท่านั้น
การปรับปรุงนี้มีคุณค่าอย่างยิ่งสำหรับระบบที่จัดการกับ workloads ปริมาณสูงที่แม้แต่ความไม่มีประสิทธิภาพเล็กน้อยก็สามารถสะสมเป็นปัญหาประสิทธิภาพที่สำคัญได้ ด้วยการลดการดำเนินการ I/O และการใช้หน่วยความจำ การเพิ่มประสิทธิภาพนี้ไม่เพียงแต่ปรับปรุงความเร็วของคิวรี แต่ยังลดการใช้ทรัพยากรระบบโดยรวม
อ้างอิง: Optimizing Straddled Joins in Readyset: From Hash Joins to Index Condition Pushdown