142 votes

MySQL: le moyen le plus rapide de compter le nombre de lignes

Quelle manière de compter un nombre de lignes devrait être plus rapide dans MySQL?

Ce:

 SELECT COUNT(*) FROM ... WHERE ...
 

Ou l'alternative:

 SELECT 1 FROM ... WHERE ...

// and then count the results with a built-in function, e.g. in PHP mysql_num_rows()
 

On pourrait penser que la première méthode devrait être plus rapide, car il s'agit clairement d'un territoire de base de données et le moteur de base de données devrait être plus rapide que quiconque lors de la détermination de telles choses en interne.

144voto

Mārtiņš Briedis Points 7934

Lorsque vous COUNT(*) il prend en compte les index de colonnes, de sorte qu'il sera le meilleur résultat. Mysql MyISAM moteur stocke le nombre de lignes, il doensn pas compter toutes les lignes à chaque fois que vous essayez de compter toutes les lignes. (basé sur la clé primaire de la colonne)

À l'aide de PHP pour le nombre de lignes n'est pas très malin, parce que vous avez à envoyer les données de mysql pour php. Pourquoi le faire quand vous pouvez obtenir le même sur la base de données mysql?

Si l' COUNT(*) est lent, vous devez exécuter EXPLAIN sur la requête, et de vérifier si des index sont vraiment utilisés, et où doivent-ils être ajoutés.


La suite n'est pas la plus rapide façon, mais il y a un cas, où l' COUNT(*) n'a pas vraiment d'ajustement lorsque vous commencez à grouper les résultats, vous pouvez exécuter problème, où COUNT n'a pas vraiment compter toutes les lignes.

La solution est - SQL_CALC_FOUND_ROWS. Ceci est habituellement utilisé lorsque vous sélectionnez des lignes, mais encore faut-il savoir le total du nombre de lignes (par exemple, pour la pagination). Lorsque vous sélectionnez des lignes de données, ajoutez simplement l' SQL_CALC_FOUND_ROWS mot-clé après avoir SÉLECTIONNER:

SELECT SQL_CALC_FOUND_ROWS [needed fields or *] FROM table LIMIT 20 OFFSET 0;

Après avoir sélectionné besoin de lignes, vous pouvez obtenir le comte avec cette requête:

SELECT FOUND_ROWS();

FOUND_ROWS() doit être appelé immédiatement après la sélection de la requête.

89voto

user1225007 Points 1

Après avoir parlé avec mes coéquipiers, Ricardo nous a dit que la façon plus rapide est:

show table status like '<TABLE NAME>' \G

Mais vous devez vous rappeler que le résultat peut ne pas être exact.

Vous pouvez l'utiliser en ligne de commande:

$ mysqlshow --status <DATABASE> <TABLE NAME>

Plus d'informations: http://dev.mysql.com/doc/refman/5.7/en/show-table-status.html

Et vous trouverez une discussion à mysqlperformanceblog

28voto

Dan Horvat Points 526

Bonne question, bonnes réponses. Voici un moyen rapide de faire écho aux résultats si quelqu'un lit cette page et en manque la partie:

 $counter = mysql_query("SELECT COUNT(*) AS id FROM table");
$num = mysql_fetch_array($counter);
$count = $num["id"];
echo("$count");
 

12voto

adarshr Points 25912

J'ai toujours compris que les réponses ci-dessous me permettraient d'obtenir les temps de réponse les plus rapides.

 SELECT COUNT(1) FROM ... WHERE ...
 

7voto

infinity Points 4236

Si vous avez besoin pour obtenir le compte de l'ensemble du jeu de résultats, vous pouvez prendre les méthodes suivantes:

SELECT SQL_CALC_FOUND_ROWS * FROM table_name LIMIT 5;
SELECT FOUND_ROWS();

Normalement, c'est pas plus rapide que d'utiliser COUNT quoique l'on pourrait penser le contraire est le cas, car c'est de faire le calcul en interne et de ne pas envoyer les données à l'utilisateur, ainsi, l'amélioration de la performance est suspectée.

Faire ces deux requêtes est bon pour la pagination pour obtenir les totaux, mais pas particulièrement pour l'utilisation de WHERE clauses.

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