web-dev-qa-db-fra.com

COUNT (id) vs COUNT (*) dans MySQL

Existe-t-il une différence entre les requêtes suivantes, en supposant qu'il existe un champ principal "id" dans la table (comme dans la vitesse, etc.)?

SELECT COUNT(id) 
  FROM table

contre. 

SELECT COUNT(*) 
  FROM table
19
James Simpson

Regardez Nombre (*) vs Nombre (col) sur www.mysqlperformanceblog.com, ils discutent de ce sujet pour différents types de "col" (PAS NULL ou non, avec index, etc.) et ceci pour MyISAM et Tables InnoDB.

18
Pascal Thivent

Je sais que la question concerne MySQL, mais compte tenu de sa valeur, count (*) est recommandé pour Oracle: ce qui prouve qu'il s'agit d'une base de données spécifique (voir le commentaire de BalusC ci-dessus). Etant donné que de nombreuses bases de données (MS-SQL, MySQL) possèdent des tables de schéma d’informations contenant différents types de métadonnées, il peut exister des différences si une syntaxe recherche simplement une valeur facilement disponible, et une autre passe directement à la table. . À la fin de la journée, essayez différentes options et voyez ce que EXPLAIN vous dit se passe dans les coulisses.

2
davek

COUNT (*) avec InnoDB est plus lent que COUNT (ID) car InnoDB ne met pas en cache le nombre de lignes.

D'autre part, avec MyISAM, la requête count (*) serait plus rapide et renverrait le résultat en un rien de temps car MyISAM conserve le nombre de lignes.

Il est facile pour MyISAM de gérer le nombre de lignes car une seule transaction est exécutée à la fois, car MyISAM effectue le verrouillage au niveau de la table. Une fois qu'une transaction est validée, MyISAM peut facilement mettre à jour le nombre de lignes d'une table (en tenant compte des insertions et des suppressions effectuées par la transaction) avant le début de la transaction suivante.

Cependant, avec InnoDB, qui utilise le verrouillage au niveau de la ligne, plusieurs transactions s'exécutent simultanément (et ne sont pas encore validées). Pour assurer la cohérence, chaque transaction doit afficher la table (y compris le nombre de lignes de la table) au début de la transaction, ainsi que ses propres modifications. Ainsi, le nombre de lignes dans la table est évidemment potentiellement différent pour chaque transaction simultanée. Par conséquent, il n'y a pas un seul nombre total «correct» de lignes à un moment donné (à moins qu'aucune transaction de mise à jour ne soit en cours d'exécution). Avec plusieurs transactions simultanées, il n'est pas vraiment possible de mettre en cache le nombre total de lignes d'une table.

1
Satakshi Pandey

Count (*) Count (Ename) Peut afficher des résultats diff, car Ename n'est pas une colonne avec Pas une contrainte nulle et il a sûrement des valeurs vides . Qui ne sont pas comptés.

J'espère que ça aide..!

0
Guguzz