อ้างอิงจากบทที่ 9 (Parser และเครื่องมือเพิ่มประสิทธิภาพ) หน้า 172 ของหนังสือเข้าใจ MySQL ภายในโดย Sasha Pachev
นี่คือการสลายการประเมินผลของแบบสอบถามเป็นงานต่อไปนี้:
- กำหนดว่าจะใช้คีย์ใดเพื่อดึงข้อมูลจากตารางและเลือกคีย์ที่ดีที่สุดสำหรับแต่ละตาราง
- สำหรับแต่ละตารางให้พิจารณาว่าการสแกนตารางนั้นดีกว่าหรือไม่หากอ่านบนคีย์ หากมีระเบียนจำนวนมากที่ตรงกับค่าคีย์ข้อดีของคีย์จะลดลงและการสแกนตารางจะเร็วขึ้น
- กำหนดลำดับที่ควรเข้าร่วมตารางเมื่อมีมากกว่าหนึ่งตารางที่มีอยู่ในแบบสอบถาม
- เขียนคำสั่ง WHERE เพื่อกำจัดรหัสที่ตายแล้วลดการคำนวณที่ไม่จำเป็นและเปลี่ยนข้อ จำกัด เมื่อใดก็ตามที่เป็นไปได้เพื่อเปิดทางสำหรับการใช้กุญแจ
- กำจัดตารางที่ไม่ได้ใช้ออกจากการเข้าร่วม
- ตรวจสอบว่าปุ่มสามารถใช้สำหรับการและ
ORDER BY
GROUP BY
- พยายามทำให้แบบสอบถามย่อยง่ายขึ้นรวมถึงกำหนดว่าแคชผลลัพธ์ของพวกเขาจะมีขอบเขตเท่าใด
- ผสานมุมมอง (ขยายการอ้างอิงมุมมองเป็นแมโคร)
ในหน้าเดียวกันนั้นจะกล่าวสิ่งต่อไปนี้:
ในคำศัพท์เครื่องมือเพิ่มประสิทธิภาพ MySQL ทุกแบบสอบถามเป็นชุดของการรวม คำที่เข้าร่วมจะใช้ที่นี่กว้างมากขึ้นกว่าในคำสั่ง SQL แบบสอบถามในหนึ่งตารางเท่านั้นคือการเข้าร่วมที่ลดลง แม้ว่าโดยปกติเราจะไม่คิดถึงการอ่านบันทึกจากตารางหนึ่งเป็นการเข้าร่วมโครงสร้างและอัลกอริธึมเดียวกันกับที่ใช้กับการรวมทั่วไปจะทำงานได้อย่างสมบูรณ์แบบเพื่อแก้ไขแบบสอบถามด้วยตารางเดียวเท่านั้น
บทส่งท้าย
เนื่องจากกุญแจมีอยู่จำนวนข้อมูลและการแสดงออกของแบบสอบถามบางครั้ง MySQL Joins อาจทำสิ่งต่าง ๆ เพื่อประโยชน์ของเรา (หรือเพื่อกลับมาที่เรา) และเกิดผลลัพธ์ที่เราไม่คาดหวังและไม่สามารถอธิบายได้อย่างรวดเร็ว
ฉันเขียนเกี่ยวกับการเล่นโวหารนี้ก่อน
เพราะเครื่องมือเพิ่มประสิทธิภาพการสืบค้น MySQL สามารถทำการยกเลิกคีย์บางอย่างในระหว่างการประเมินผลของแบบสอบถาม
ความคิดเห็นของ @ Phil ช่วยให้ฉันเห็นวิธีโพสต์คำตอบนี้ (+1 สำหรับความคิดเห็นของ @ Phil)
ความคิดเห็นของ @ ypercube (+1 สำหรับสิ่งนี้ด้วย) เป็นรุ่นที่กะทัดรัดของโพสต์ของฉันเพราะ MySQL Query Optimizer เป็นพื้นฐาน น่าเสียดายที่มันต้องเกี่ยวข้องกับเอ็นจิ้นการเก็บข้อมูลภายนอก
สรุปผลการศึกษา
สำหรับคำถามที่แท้จริงของคุณเครื่องมือเพิ่มประสิทธิภาพการสืบค้น MySQL จะกำหนดตัวชี้วัดประสิทธิภาพการทำงานของแต่ละแบบสอบถามเมื่อเสร็จสิ้น
- การนับแถว
- การเลือกปุ่ม
- ชุดผลลัพธ์การนวดเป็นระยะ
- โอ้ใช่เข้าร่วมจริง
คุณอาจจะต้องบีบบังคับลำดับของการดำเนินการโดยการเขียนใหม่ (refactoring) แบบสอบถาม
นี่คือคิวรีแรกที่คุณให้
select count(*)
from table1 a
join table2 b
on b.key_col=a.key_col
where b.tag = 'Y';
ลองเขียนใหม่เพื่อประเมิน WHERE ก่อน
select count(*)
from table1 a
join (select key_col from table2 where tag='Y') b
on b.key_col=a.key_col;
นั่นจะเปลี่ยนแผนอย่างชัดเจน มันสามารถสร้างผลลัพธ์ที่ดีขึ้นหรือแย่ลง
ฉันเคยตอบคำถามใน StackOverflow ที่ฉันใช้เทคนิคนี้ อธิบายได้น่ากลัว แต่ประสิทธิภาพการทำงานเป็นไดนาไมต์ มันทำงานเพราะมีดัชนีที่ถูกต้องในปัจจุบันและการใช้งานของ LIMIT ในแบบสอบถามย่อย
เช่นเดียวกับราคาหุ้นเมื่อพูดถึงการค้นหาและพยายามแสดงข้อ จำกัด การใช้งานผลลัพธ์อาจแตกต่างกันไปและประสิทธิภาพที่ผ่านมาไม่ได้บ่งบอกถึงผลลัพธ์ในอนาคต