เอาท์พุทอธิบายให้เห็นว่าดัชนีของฉันไม่ได้ถูกใช้


9

ฉันได้ตั้งค่าตารางของฉันด้วยดัชนีเฉพาะบน done_status (done_status = INT):

ป้อนคำอธิบายรูปภาพที่นี่

เมื่อฉันใช้:

EXPLAIN SELECT * FROM reminder  WHERE done_status=2

ฉันได้รับมันกลับมา:

id select_type ชนิดของตารางที่เป็นไปได้คีย์คีย์ key_len แถวอ้างอิงพิเศษ
1 ตัวเตือนที่เรียบง่าย ALL done_status NULL NULL NULL 5 การใช้ตำแหน่ง

แต่เมื่อฉันออกคำสั่งนี้:

EXPLAIN SELECT * FROM reminder  WHERE done_status=1

ฉันได้รับผลตอบแทนดังต่อไปนี้:

id select_type ชนิดของตารางที่เป็นไปได้คีย์คีย์ key_len แถวอ้างอิงพิเศษ
1 การแจ้งเตือนที่เรียบง่ายอ้างอิงจากเสร็จ _status done_status 4 const 2   

มันEXPLAINแสดงให้ฉันเห็นว่ามันใช้ 5 แถวครั้งที่สอง 2 แถว

ฉันไม่คิดว่าจะใช้ดัชนีถ้าฉันเข้าใจถูกต้องในครั้งแรกควรให้ 3 แถว ฉันทำอะไรผิด

SHOW INDEX FROM reminder:

ตาราง Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part ที่บรรจุ Null Index_type ความคิดเห็น Index_comment
เตือนความจำ 1 done_status 1 done_status A 5 NULL NULL BTREE

อธิบายเพิ่มเติม:

id select_type ชนิดของตารางที่เป็นไปได้ key_keys คีย์แถวอ้างอิง ref กรองพิเศษ
1 ตัวเตือน SIMPLE ref done_status done_status 4 const 2 100.00

show warnings ไม่แสดงความสนใจเลย


เชื่อฉันดัชนีทำงาน แต่ฉันไม่เห็นอะไรง่ายๆในภาพหน้าจอของคุณ - คุณสามารถทำ "ดัชนีแสดงจาก yourtable" ได้ไหม

ใช่แก้ไขคำถามของฉัน

โปรดใช้ glorify \ G สำหรับสคีมาและอธิบายผลลัพธ์ของแผนควรอ่านได้มากขึ้น
ajreal

ที่น่าสนใจคุณสามารถทำซ้ำกับ "อธิบายการขยาย" และ "คำเตือนการแสดง" นี้จะแสดงให้เห็นถึงการเลือก mysql SQL จริง

@ajreal เชิดชูเกียรติคืออะไร?

คำตอบ:


4

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


ดังนั้น? ฉันพูดว่ามันทำที่ไหน เครื่องมือเพิ่มประสิทธิภาพเลือกได้ถึงอะไร ดัชนียังคงใช้งานได้

@ajreal มันไม่ได้หมายความว่าดัชนีเสีย เพียงแค่เครื่องมือเพิ่มประสิทธิภาพเลือก (ในใจ) วิธีที่มีประสิทธิภาพที่สุดในการค้นหาข้อมูล ฉันคิดว่าผู้ปฏิบัติการคาดหวังว่าคอลัมน์ในแถวในอธิบายจะถูกต้อง ไม่ได้หมายความว่าดัชนีเสียหาย - เพียง แต่ mysql เลือกที่จะไม่ใช้ (อาจ)

1
@ajreal: ฉันพลาดบางสิ่งในคะแนนของคุณ คอลัมน์แถวของคำอธิบายไม่เกี่ยวข้องกับดัชนีใช่ไหม? Mysql เลือกที่จะไม่ใช้ดัชนี (อาจเป็นข้อมูลทั้งหมดในหน้าเดียว) ไม่แน่ใจว่าฉันเข้าใจประเด็นของคุณหรือไม่ การเพิ่มประสิทธิภาพการค้นหาในตาราง 5 แถวกำลังจะให้ผลลัพธ์ที่ 'แปลก' บางอย่างเพราะมันค่อนข้างไม่สำคัญว่าคุณจะปรับให้เหมาะสมอย่างไร


ในกรณีนี้ใครจะเลือกว่าจะใช้ดัชนีเพิ่มประสิทธิภาพตัวเลือก? ไม่มีอะไรผิดปกติกับดัชนีเพราะเครื่องมือเพิ่มประสิทธิภาพรู้สึกเหมือนไม่ต้องการมัน - มันมีความสำคัญอะไร?

3

การประมวลผลธรรมดาครั้งแรกไม่ได้ใช้ดัชนีอย่างแน่นอน
มันอาจเป็น information_schema.statistics ในดัชนีที่ไม่ได้ติดตามข้อมูลหลังจากการดำเนินการเขียนบางอย่างหรือไม่สามารถเข้าถึงตารางได้เป็นเวลานาน

ตามที่อธิบายไว้ที่นี่: - MySQL Query Optimizer อ่านสถิติดัชนีได้จากที่ใด

สำหรับแผนการดำเนินการครั้งที่สองดูเหมือนว่า data_schema.statistics ได้ติดตามและแก้ไขปัญหา NIN cardinality แล้ว

ดังนั้นจะดำเนินการค้นหาตามเครื่องมือเพิ่มประสิทธิภาพดัชนี

สำหรับตารางที่มีแถวเล็ก ๆ มันไม่สำคัญเท่าไหร่
แต่ข้อมูลจะเติบโตผู้พัฒนาควรทำการตรวจสอบเรื่องนี้อยู่เสมอ
และดำเนินการวิเคราะห์ตารางที่จำเป็นเมื่อพบว่าภาวะหัวใจเป็นโมฆะในดัชนี


0

แผนการดำเนินการครั้งแรกไม่ได้ใช้ดัชนี

จากเว็บไซต์อ้างอิง MySQL :

บางครั้ง MySQL ไม่ใช้ดัชนีแม้ว่าจะมีอยู่ก็ตาม เหตุการณ์หนึ่งที่เกิดขึ้นคือเมื่อเครื่องมือเพิ่มประสิทธิภาพประมาณการว่าการใช้ดัชนีจะต้องใช้ MySQL เพื่อเข้าถึงเปอร์เซ็นต์ของแถวในตาราง (ในกรณีนี้การสแกนตารางน่าจะเร็วกว่ามากเพราะต้องการการค้นหาน้อยกว่า) อย่างไรก็ตามหากแบบสอบถามดังกล่าวใช้ LIMIT เพื่อดึงข้อมูลบางแถวเท่านั้น MySQL ใช้ดัชนีอยู่แล้วเพราะสามารถค้นหาได้เร็วขึ้น ไม่กี่แถวที่จะส่งคืนผลลัพธ์

หากตารางของคุณมีเพียง 5 แถวและแบบสอบถามของคุณเลือก 3 แถวจากนั้นเครื่องมือเพิ่มประสิทธิภาพ MySQL จะถือว่ามีประสิทธิภาพมากขึ้นในการสแกนทั้งตาราง

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