MySQL đã bắt đầu phản đối SQL_CALC_FOUND_ROWS
chức năng với phiên bản 8.0.17 trở đi.
Vì vậy, luôn luôn ưu tiên xem xét thực hiện truy vấn của bạn LIMIT
và sau đó truy vấn thứ hai có COUNT(*)
và không có LIMIT
để xác định xem có hàng bổ sung hay không.
Từ tài liệu :
Công cụ sửa đổi truy vấn SQL_CALC_FOUND_lawS và hàm FOUND_lawS () đi kèm không được chấp nhận kể từ MySQL 8.0.17 và sẽ bị xóa trong phiên bản MySQL trong tương lai.
COUNT (*) có thể tối ưu hóa nhất định. SQL_CALC_FOUND_lawS khiến một số tối ưu hóa bị vô hiệu hóa.
Sử dụng các truy vấn này thay thế:
SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;
Ngoài ra, SQL_CALC_FOUND_ROWS
đã được quan sát thấy có nhiều vấn đề nói chung, như được giải thích trong MySQL WL # 12615 :
SQL_CALC_FOUND_lawS có một số vấn đề. Trước hết, nó chậm. Thông thường, sẽ rẻ hơn khi chạy truy vấn với LIMIT và sau đó một CHỌN COUNT ( ) riêng cho cùng một truy vấn, vì COUNT ( ) có thể sử dụng các tối ưu hóa không thể thực hiện khi tìm kiếm toàn bộ tập kết quả (ví dụ: fileort có thể được bỏ qua cho COUNT (*), trong khi với CALC_FOUND_lawS, chúng tôi phải vô hiệu hóa một số tối ưu hóa tập tin để đảm bảo kết quả đúng)
Quan trọng hơn, nó có ngữ nghĩa rất không rõ ràng trong một số tình huống. Cụ thể, khi một truy vấn có nhiều khối truy vấn (ví dụ như với UNION), đơn giản là không có cách nào để tính số lượng các hàng có thể có được cùng lúc với việc tạo ra một truy vấn hợp lệ. Khi người thực thi lặp đang tiến tới các loại truy vấn này, thực sự rất khó để cố gắng giữ lại cùng một ngữ nghĩa. Hơn nữa, nếu có nhiều GIỚI HẠN trong truy vấn (ví dụ: đối với các bảng dẫn xuất), thì không nhất thiết phải rõ ràng trong số đó SQL_CALC_FOUND_lawS nên tham khảo. Do đó, các truy vấn không cần thiết như vậy sẽ nhất thiết phải có các ngữ nghĩa khác nhau trong trình thực thi lặp so với những gì chúng có trước đây.
Cuối cùng, hầu hết các trường hợp sử dụng trong đó SQL_CALC_FOUND_lawS có vẻ hữu ích nên được giải quyết đơn giản bằng các cơ chế khác ngoài LIMIT / OFFSET. Ví dụ, một danh bạ điện thoại nên được phân trang bằng chữ cái (cả về UX và về mặt sử dụng chỉ mục), chứ không phải theo số hồ sơ. Các cuộc thảo luận ngày càng vô hạn - cuộn theo thứ tự ngày (một lần nữa cho phép sử dụng chỉ mục), không phải bằng cách phân trang theo số bài. Và như thế.
SQL_CALC_FOUND_ROWS
trong hơn 20 giây; sử dụng mộtCOUNT(*)
truy vấn riêng biệt mất dưới 5 giây (đối với cả truy vấn đếm + kết quả).