วิธีการประเมินการดำเนินงาน I / O ที่ดำเนินการโดยแบบสอบถาม MySQL?


13

ใน RDS ของ Amazon คุณต้องจ่ายประมาณ $ 0.10 ต่อ 1 ล้านคำขอ I / O ฉันสังเกตเห็นคำขอ I / O จำนวนมาก (เป็นแสน) สำหรับฐานข้อมูลปริมาณการใช้งานที่ต่ำมาก เมื่อเห็นสิ่งนี้ฉันได้ทำการวิจัยเพิ่มเติมและพบคำถามนี้ซึ่งอธิบายว่าสำหรับเว็บไซต์ผู้ใช้ 6,000 แห่งเขาได้สร้างคำขอ I / O 800 ล้านต่อเดือนซึ่งจะทำให้เขาต้องเสียเงินราว ๆ $ 80 / เดือน

ดังนั้นฉันต้องการทราบล่วงหน้าว่าจะมีการดำเนินการแบบสอบถาม I / O MySQL จำนวนเท่าใดและจะเพิ่มประสิทธิภาพ / ย่อเล็กสุดได้อย่างไร มีวิธีใดที่จะประมาณจำนวนการดำเนินการของ I / O ที่แบบสอบถามจะดำเนินการและกฎทั่วไปที่ฉันสามารถปฏิบัติตามเพื่อให้ต่ำที่สุดเท่าที่เป็นไปได้

คำตอบ:


2

คำตอบ Wiki ชุมชนที่สร้างจากความเห็นเกี่ยวกับคำถามโดยRaymond Nijland

EXPLAINใช้ วิธีนี้คุณสามารถดูว่าคิวรีอาจต้องใช้ดิสก์ IO คุณต้องหลีกเลี่ยงในคอลัมน์พิเศษ "การใช้ชั่วคราว" หรือ "" การใช้ชั่วคราว; การใช้ filesort (โปรดสังเกตว่า filesort เป็นชื่อที่ทำให้เข้าใจผิด: หากชุดผลลัพธ์มีความเหมาะสมในหน่วยความจำ quicksort จะทำงานในหน่วยความจำ) "

นี่น่าจะเกิดจากคิวรีย่อย / สหภาพ / ใบสั่งโดย / กลุ่มโดย / ... หากผลลัพธ์ของคุณมีขนาดใหญ่และมีการสร้างตารางชั่วคราวที่ใช้ดิสก์ MyISAM และคุณต้องเรียงลำดับผลลัพธ์คุณกำลังเรียงลำดับผลลัพธ์ ตั้งค่าตามการอ่าน IO และ IO เขียนด้วยอัลกอริทึม quicksort

ในInternal Temporary Table ใช้ใน MySQLคุณสามารถอ่านได้เมื่อ MySQL ต้องการสร้างตาราง MyISAM บนดิสก์ บางทีคุณสามารถใช้แถว avg_row_length * (โปรดทราบว่าค่าแถวจากการอธิบายไม่ถูกต้องกับเอ็นจิ้น InnoDB) เพื่อตรวจสอบว่าผลลัพธ์นั้นเหมาะกับฮีปหรือไม่ ดูการแสดงตารางสถานะไวยากรณ์

โดยทั่วไปแล้ว InnoDB หรือ MyISAM ดีกว่าสำหรับการหลีกเลี่ยงคำขอ I / O หรือไม่?

InnoDB จะบัฟเฟอร์ข้อมูลตารางและข้อมูลดัชนีในขณะที่ MyISAM เพียงคีย์บัฟเฟอร์ดัชนี จำเป็นต้องใช้ I / O กับข้อมูลตารางเมื่ออธิบายคอลัมน์พิเศษไม่ได้พูดว่า "การใช้ดัชนี"

หากทั้งคู่กำลังใช้ดัชนี: ด้วย InnoDB หากบัฟเฟอร์ร้อนก็สามารถโหลดข้อมูลจากหน่วยความจำได้ หากดัชนีจำเป็นต้องมาจากดิสก์มีสูตรที่คุณสามารถใช้ในการคำนวณการอ่าน IO ที่จำเป็นสำหรับการเลือกแทรกและการปรับปรุง จากการประมาณประสิทธิภาพการค้นหา :

สำหรับตารางขนาดเล็กคุณมักจะพบแถวในหนึ่งดิสก์ค้นหา (เพราะดัชนีอาจแคช) สำหรับตารางที่ใหญ่กว่าคุณสามารถประมาณได้ว่าการใช้ดัชนีต้นไม้แบบ B คุณจำเป็นต้องหาแถวจำนวนมากเพื่อหาแถว:

log(rows) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1

ดัชนี InnoDB มีขนาดใหญ่กว่าเนื่องจากเก็บข้อมูลไว้ในคีย์หลัก / UNIQUE ลงในดัชนี KEY สิ่งนี้เร็วกว่าและต้องการ IO น้อยกว่า แต่คุณสามารถบีบอัดข้อมูลหรือดัชนี InnoDB

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.