Mysql
 sql >> Base de données >  >> RDS >> Mysql

SELECT SQL_CALC_FOUND_ROWS Requête très lente supérieure à 250 000 enregistrements

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.