ความหมายของตัวกรองใน MySQL อธิบายคืออะไร?


21

ตามที่อธิบายไว้ในเอกสาร MySQL :

คอลัมน์ที่กรองจะระบุเปอร์เซ็นต์ของแถวของตารางโดยประมาณที่จะถูกกรองตามเงื่อนไขของตาราง นั่นคือแถวแสดงจำนวนแถวที่ตรวจสอบโดยประมาณและแถวที่กรอง× / 100 แสดงจำนวนแถวที่จะเข้าร่วมกับตารางก่อนหน้า ก่อน MySQL 5.7.3 คอลัมน์นี้จะปรากฏขึ้นหากคุณใช้ EXPLAIN EXTENDED ในฐานะของ MySQL 5.7.3 เอาต์พุตที่ขยายเพิ่มจะถูกเปิดใช้งานโดยค่าเริ่มต้นและคำหลัก EXTENDED นั้นไม่จำเป็น

ฉันยังไม่เข้าใจ ความหมายของ "ตัวกรอง" ที่นี่คืออะไร? เราจะได้ข้อมูลอะไรจากคอลัมน์นี้?

ตัวอย่างเช่นเมื่อฉันเริ่มสอบถามบางแบบสอบถามจะแสดง 100 และบางคนแสดง 18 หรือต่ำกว่า 100

+-------------+-------+--------+---------+---------+------+----------+
| select_type | table | type   | key     | key_len | rows | filtered |
+-------------+-------+--------+---------+---------+------+----------+
| PRIMARY     | a     | range  | search  | 4       |  174 |   18.00  | <--
| PRIMARY     | b     | eq_ref | PRIMARY | 4       |    1 |   100.00 |
| PRIMARY     | c     | ALL    | PRIMARY | 4       |    1 |   100.00 |

ประเด็นหลักที่เราสามารถสรุปได้จากค่านี้คืออะไร?

มันบอกว่าคอลัมน์กรองเพียง 18%? หรือถ้ายิ่งลดคะแนนยิ่งดัชนี / ข้อความค้นหาดีขึ้นเท่าใด

ฉันใช้ MySQL 5.7

คำตอบ:


30

ในการกรองที่นี่หมายถึงการใช้เงื่อนไขกับชุดของแถวที่เลือกโดยtype-search เป็นแถวที่เป็นไปได้และเพื่อให้แถวที่ตรงตามเงื่อนไขเท่านั้น:

MySQL จะพยายามใช้ดัชนีเป็นอันดับแรกเช่นทำการrangeสแกนบนตารางของคุณaโดยใช้search-key มันประมาณการที่จะได้รับ 174 rowsแถวออกจากการใช้ดัชนีที่ซึ่งเป็นหมายเลขใน ขั้นตอนนี้ยังไม่เรียกว่าการกรอง

หลังจากนั้นต้องทำการตรวจสอบ 174 แถวกับเงื่อนไขเพิ่มเติม (โดยปกติจะอยู่ในwhere-clause ของคุณ) ขณะนี้ MySQL ประเมินว่ามีเพียง 32 แถวเท่านั้นดังนั้น 18% ของ 174 แถวเหล่านี้จะยังคงอยู่หลังจากตัวกรองนั้นถูกนำไปใช้ นี้ 18% filteredเป็นค่าในการ

ในขณะที่เห็นได้ชัดว่าดีกว่าที่จะมี 32 แถวแทนที่จะเป็น 174 (ถ้าคุณต้องการภายหลังjoinด้วยตารางอื่น) ดัชนี "สมบูรณ์แบบ" จะทำให้คุณมี 32 แถวเหล่านี้โดยตรงจากการค้นหาเริ่มต้นช่วยให้คุณประหยัดเวลาในการดู และกรอง 82% ของแถวที่เป็นไปได้ทั้งหมด

ดังนั้นค่าที่ต่ำอาจบ่งบอกว่าอาจมีดัชนีที่ดีกว่า: เช่นการสแกนเต็มตารางด้วยrows=1000และfiltered=0.1%อาจกลายเป็นการค้นหาดัชนีด้วยrows=1และfiltered=100%ถ้าคุณเพิ่มดัชนีที่ดี

บนมืออื่น ๆ ที่คุณสามารถเป็นอย่างดีสมบูรณ์ไม่สนใจนี้filtered-value (ซึ่งในกรณีส่วนใหญ่ประมาณการที่ดีจริงๆอยู่แล้ว) และมุ่งเน้นในคอลัมน์ที่สำคัญอื่น ๆ (โดยเฉพาะอย่างยิ่งtype, keyและextra) เพื่อเพิ่มประสิทธิภาพการค้นหาของคุณ มันอาจจะดีกว่าที่จะกำจัดfilesort(เช่นโดยใช้ดัชนีที่ตรงกับorder by) แม้ว่ามันจะส่งผลให้filteredค่าที่ต่ำกว่า และดีกว่าที่จะส่งผลในการปรับปรุงประสิทธิภาพการทำงานอย่างมากถึงแม้ว่ามันอาจจะไม่เปลี่ยนแปลงหรือแม้แต่น้อยtype filteredในตัวอย่างข้างต้นด้วยfiltered=0.1%, type=allจะมีอยู่แล้วจะเพียงพอที่จะแสดงให้เห็นว่าคุณอาจจะสามารถที่จะปรับปรุงแบบสอบถามที่โดยการเพิ่มดัชนีโดยไม่ต้องมองหาที่filteredที่ทุกคน

ดังนั้นอย่าจริงจังกับค่านั้น: ไม่ได้100หมายความว่าดัชนีของคุณดีและค่าที่ต่ำกว่าก็ไม่จำเป็นต้องบ่งบอกถึงดัชนีที่ไม่ดี typeเป็นตัวบ่งชี้ที่ดีกว่ามากสำหรับสิ่งนั้น


1
ขอบคุณสำหรับคำอธิบาย มันอธิบายได้มากมายสำหรับฉัน ฉันคิดว่ามันมีประโยชน์สำหรับการบำรุงรักษาและการเลือกดัชนีที่ดี
Iman Tumorang

@ImanTumorang ฉันได้เพิ่มคำพูดและตัวอย่างเกี่ยวกับสิ่งนั้น: อย่าคำนึงถึงคุณค่านั้นอย่างจริงจังเกินไป คุณสามารถเพิ่มประสิทธิภาพการค้นหาของคุณโดยเพียงแค่ดูtypeและextra(ซึ่งเป็นศิลปะของตัวเอง); คุณสามารถอยู่ได้โดยปราศจากfilteredแต่ไม่ได้typeอยู่ข้างนอก
Solarflare

โอเคแล้ว ฉันเข้าใจแล้ว. ฉันอ่านแล้วใน Mysql Docs ว่ามีผลต่อประสิทธิภาพอย่างไร ขอบคุณสำหรับคำอธิบายของคุณ: D
Iman Tumorang

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