Il y a une bonne description dans ce blog :https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/
La démonstration montre que oui, l'utilisation de SQL_CALC_FOUND_ROWS est très mauvaise pour les performances lorsque vous l'utilisez sur une grande table.
Il est souvent préférable d'exécuter deux requêtes séparément :
/* 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
Soit dit en passant, cela n'est pas lié au problème SQL_CALC_FOUND_ROWS, mais je me demande pourquoi vous rejoignez les main_members
table. Vous n'en extrayez aucune colonne. Le LEFT JOIN signifie qu'il ne restreindra pas les lignes. Si je peux déduire la relation de table à partir des noms de colonne, il ne peut y avoir qu'une seule ligne dans main_members
pour chaque ligne dans main_articles
, de sorte que la jointure n'augmentera pas non plus le nombre de lignes. Il n'y a donc vraiment aucun intérêt à faire cette jointure.