MySQL ได้เริ่มลดSQL_CALC_FOUND_ROWS
ฟังก์ชันการทำงานกับเวอร์ชัน 8.0.17 เป็นต้นไป
ดังนั้นจึงเป็นที่นิยมเสมอในการพิจารณาดำเนินการสืบค้นด้วยLIMIT
และจากนั้นแบบสอบถามที่สองที่มีCOUNT(*)
และไม่มีLIMIT
เพื่อตรวจสอบว่ามีแถวเพิ่มเติมหรือไม่
จากเอกสาร :
ตัวแก้ไขคิวรี่ SQL_CALC_FOUND_ROWS และฟังก์ชัน FOUND_ROWS () ที่มาพร้อมกับเลิกใช้งานแล้วในฐานะของ MySQL 8.0.17 และจะถูกลบออกในรุ่น MySQL ในอนาคต
COUNT (*) ขึ้นอยู่กับการปรับให้เหมาะสมบางอย่าง SQL_CALC_FOUND_ROWS ทำให้การเพิ่มประสิทธิภาพบางอย่างถูกปิดใช้งาน
ใช้คำค้นหาเหล่านี้แทน:
SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;
นอกจากนี้SQL_CALC_FOUND_ROWS
ยังพบว่ามีปัญหามากกว่าปกติดังที่อธิบายไว้ในMySQL WL # 12615 :
SQL_CALC_FOUND_ROWS มีปัญหาหลายอย่าง ก่อนอื่นมันช้า บ่อยครั้งจะมีราคาถูกกว่าในการเรียกใช้แบบสอบถามด้วย LIMIT จากนั้นเลือก SELECT COUNT ( ) สำหรับการสืบค้นเดียวกันเนื่องจาก COUNT ( ) สามารถใช้ประโยชน์จากการเพิ่มประสิทธิภาพที่ไม่สามารถทำได้เมื่อค้นหาชุดผลลัพธ์ทั้งหมด (เช่น filesort สามารถข้ามได้สำหรับ COUNT (*) ในขณะที่ CALC_FOUND_ROWS เราต้องปิดการใช้งานการเพิ่มประสิทธิภาพของไฟล์บางไฟล์เพื่อรับประกันผลลัพธ์ที่ถูกต้อง)
ที่สำคัญกว่านั้นมันมีความหมายที่ชัดเจนมากในหลายสถานการณ์ โดยเฉพาะอย่างยิ่งเมื่อแบบสอบถามมีบล็อกแบบสอบถามหลายรายการ (เช่นกับ UNION) จะไม่มีวิธีการคำนวณจำนวนแถวที่ "ต้องการ" ในเวลาเดียวกันพร้อมกับสร้างแบบสอบถามที่ถูกต้อง เนื่องจากตัวดำเนินการตัววนซ้ำกำลังดำเนินการไปยังคิวรีประเภทนี้จึงเป็นเรื่องยากที่จะพยายามรักษาความหมายเดิมไว้ นอกจากนี้หากมีข้อ จำกัด หลายอย่างในแบบสอบถาม (เช่นสำหรับตารางที่ได้รับมา) ก็ไม่จำเป็นต้องชัดเจนว่าควรใช้คำใดใน SQL_CALC_FOUND_ROWS ดังนั้นข้อความค้นหาที่ไม่เกี่ยวกับความจำเป็นจะต้องได้รับซีแมนทิกส์ที่แตกต่างกันในตัวดำเนินการตัววนซ้ำเมื่อเปรียบเทียบกับสิ่งที่พวกเขาเคยทำมาก่อน
ในที่สุดกรณีการใช้งานส่วนใหญ่ที่ดูเหมือนว่ามีประโยชน์ SQL_CALC_FOUND_ROWS ควรแก้ไขโดยกลไกอื่น ๆ กว่า LIMIT / OFFSET เช่นสมุดโทรศัพท์ควรมีเลขหน้าตัวอักษร (ทั้งในแง่ของ UX และในแง่ของการใช้ดัชนี) ไม่ได้ตามหมายเลขบันทึก การสนทนาจะเพิ่มขึ้นอย่างไม่มีที่สิ้นสุดเลื่อนเรียงตามวันที่ (อนุญาตให้ใช้ดัชนีอีกครั้ง) ไม่ใช่โดยเลขหน้าโพสต์ และอื่น ๆ
SQL_CALC_FOUND_ROWS
ใช้เวลามากกว่า 20 วินาที การใช้COUNT(*)
ข้อความค้นหาแยกกันใช้เวลาไม่เกิน 5 วินาที (สำหรับทั้งข้อความค้นหานับ + ผลลัพธ์)