Có một mô tả hay trong blog này: https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/
Minh chứng cho thấy rằng có, việc sử dụng SQL_CALC_FOUND_ROWS rất kém hiệu quả khi bạn sử dụng nó trên một bảng lớn.
Thường tốt hơn là chạy hai truy vấn riêng biệt:
/* no need to do the join in this case, because it won't affect the count */
SELECT COUNT(*)
FROM main_articles
WHERE `article_type`='2'
SELECT main_article.*
FROM main_articles
LEFT JOIN main_members
ON article_mem_id=member_id
WHERE `article_type`='2'
ORDER BY article_id
DESC LIMIT 0,20
Nhân tiện, điều này không liên quan đến vấn đề SQL_CALC_FOUND_ROWS, nhưng tôi thắc mắc tại sao bạn lại tham gia vào main_members
bàn. Bạn không tìm nạp bất kỳ cột nào từ nó. LEFT JOIN có nghĩa là nó sẽ không hạn chế các hàng. Nếu tôi có thể suy ra mối quan hệ bảng từ tên cột, thì chỉ có thể có một hàng trong main_members
cho mỗi hàng trong main_articles
, vì vậy phép nối cũng sẽ không làm tăng số hàng. Vì vậy, thực sự không có mục đích để thực hiện việc tham gia này.