คำตอบ 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