192 votes

Qui est le plus rapide? SELECT SQL_CALC_FOUND_ROWS DE "table" ou SELECT COUNT(*)

Lorsque vous limitez le nombre de lignes retournées par une requête SQL, habituellement utilisée dans la pagination, il existe deux méthodes pour déterminer le nombre total d'enregistrements:

Méthode 1

Inclure l' SQL_CALC_FOUND_ROWS option à l'origine, SELECT, puis obtenir le nombre total de lignes en cours d'exécution SELECT FOUND_ROWS():

SELECT SQL_CALC_FOUND_ROWS * FROM table WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();  

Méthode 2

Exécuter la requête normalement, puis obtenir le nombre total de lignes en cours d'exécution SELECT COUNT(*)

SELECT * FROM table WHERE id > 100 LIMIT 10;
SELECT COUNT(*) FROM table WHERE id > 100;  

Quelle méthode est la meilleure / la plus rapide?

128voto

nathan Points 2755

Il dépend. Voir les Performances MySQL billet de Blog sur ce sujet: http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/

Juste un rapide résumé: Pierre dit que cela dépend de votre index et d'autres facteurs. Beaucoup de commentaires à ce post à l'air de dire que SQL_CALC_FOUND_ROWS est presque toujours plus lente, parfois jusqu'à 10 fois plus lente que l'exécution de deux requêtes.

22voto

Jeff Clemens Points 318

Au moment de choisir la "meilleure" approche, un objectif plus important que la vitesse pourrait être de la maintenabilité et de l'exactitude de votre code. Si oui, SQL_CALC_FOUND_ROWS est préférable, car vous avez seulement besoin de maintenir une seule requête. À l'aide d'une seule requête exclut complètement la possibilité d'une différence subtile entre le principal et le comte de requêtes, ce qui peut conduire à une fausse COMTE.

10voto

À mon humble avis, la raison pourquoi les 2 requêtes

SELECT * FROM count_test WHERE b = 666 ORDER BY c LIMIT 5;
SELECT count(*) FROM count_test WHERE b = 666;

sont plus rapide que d'utiliser SQL_CALC_FOUND_ROWS

SELECT SQL_CALC_FOUND_ROWS * FROM count_test WHERE b = 555 ORDER BY c LIMIT 5;

doit être vu comme un cas particulier.

Dans les faits dépend de la sélectivité de la clause where par rapport à la sélectivité de l'implicite, l'équivalent de la COMMANDE + LIMITE.

Comme Arvids dit en commentaire (http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/#comment-1174394), le fait que l'EXPLIQUEZ l'utilisation, ou non, d'une table temporaire, devrait être une bonne base pour savoir si SCFR sera plus rapide ou pas.

Mais, comme je l'ai ajouté (http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/#comment-8166482), le résultat est vraiment, vraiment dépend du cas. Pour un particulier paginator, vous pouvez arriver à la conclusion que "pour les 3 premières pages, utilisez les 2 requêtes; pour les pages suivantes, utilisez un SCFR" !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X