Na tym blogu jest dobry opis:https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/
Demonstracja pokazuje, że tak, użycie SQL_CALC_FOUND_ROWS jest bardzo złe dla wydajności, gdy używasz go na dużym stole.
Często lepiej jest uruchomić dwa zapytania oddzielnie:
/* 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
Nawiasem mówiąc, nie jest to związane z problemem SQL_CALC_FOUND_ROWS, ale zastanawiam się, dlaczego dołączasz do main_members
stół. Nie pobierasz z niego żadnych kolumn. LEFT JOIN oznacza, że nie będzie ograniczać rzędów. Jeśli mogę wywnioskować relację między tabelami z nazw kolumn, w main_members
może być tylko jeden wiersz dla każdego wiersza w main_articles
, więc złączenie również nie zwiększy liczby wierszy. Więc tak naprawdę nie ma sensu robić tego łączenia.