Compter les lignes du tableau

167

Quelle est la commande MySQL pour récupérer le nombre d'enregistrements dans une table?

DJ.
la source

Réponses:

238
SELECT COUNT(*) FROM fooTable;

comptera le nombre de lignes du tableau.

Voir le manuel de référence .

Gregory Pakosz
la source
7
Est-ce plus rapide d'utiliser le nom de la colonne indexée au lieu de *? Comme ceci: SELECT COUNT (id) FROMtablename
1
Seulement un peu. J'ai eu une table de 21961904 lignes que son COUNT a interrogé en 115 secondes, tandis que l'utilisation de l'ID a pris 107 secondes.
Bondolin
2
COUNT (*) est une définition de langage stricte. Vous obtiendrez une erreur d'analyse si vous essayez COUNT (*) notez l'espace
ppostma1
9
Vous pouvez le faire COUNT(1), ce sera le moyen le plus rapide.
Shota Papiashvili le
Quelle est la meilleure façon d'utiliser COUNT () pour écrire une variable en PHP? Dois-je faire "... COUNT (*) AS rowCount ..." dans le SQL, utilise-t-il $ results-> num_rows, ou y a-t-il un moyen d'appeler ce résultat directement?
Nosajimiki
72

Parce que personne ne l'a mentionné:

show table status;

répertorie tous les tableaux avec des informations supplémentaires, y compris les lignes estimées pour chaque tableau. C'est ce que phpMyAdmin utilise pour sa page de base de données.

Ces informations sont disponibles dans MySQL 4, probablement dans MySQL 3.23 depuis trop longtemps dans la base de données des schémas d'information préalable.

METTRE À JOUR:

Puisqu'il y a eu un vote négatif , je tiens à préciser que le nombre indiqué est estimé pour InnoDB et TokuDB et qu'il est tout à fait correct pour les moteurs de stockage MyISAM et Aria (Maria).

Selon la documentation :

Le nombre de lignes. Certains moteurs de stockage, tels que MyISAM, stockent le décompte exact. Pour d'autres moteurs de stockage, tels que InnoDB, cette valeur est une approximation et peut varier de la valeur réelle de 40% à 50%. Dans de tels cas, utilisez SELECT COUNT (*) pour obtenir un décompte précis.

C'est également le moyen le plus rapide de voir le nombre de lignes sur MySQL, car une requête comme:

select count(*) from table;

Effectuer une analyse complète de la table ce qui pourrait être une opération très coûteuse qui pourrait prendre des heures sur un grand serveur à charge élevée. Il augmente également les E / S disque.

La même opération peut bloquer la table pour les insertions et les mises à jour - cela se produit uniquement sur les moteurs de stockage exotiques.

InnoDB et TokuDB sont OK avec le verrouillage de table, mais nécessitent une analyse complète de la table.

pseudo
la source
3
Cela semble être le moyen le plus efficace de compter les lignes. Je me demande pourquoi ce n'est pas la réponse? J'utilise InnoDB. Avec le verrouillage de la table, le nombre de lignes doit être exact, non?
Chung Lun Yuen
pour innodb, il est estimé . mais vous pouvez l'utiliser dans certains cas "Notre site Web a xxx membres", "Nous avons détecté des résultats xxx similaires aux vôtres" et ainsi de suite.
Nick
Je ne suis pas sûr. mais pour Innodb, ce n'est pas un vrai compte. Mais est assez utile pour des millions de tables de lignes.
Nick
4
Parcourir les tableaux pour compter chaque ligne pour obtenir un nombre de lignes est plutôt ridicule. Je préfère donc cette réponse également.
th3penguinwhisperer
35

Nous avons un autre moyen de connaître le nombre de lignes dans une table sans exécuter une selectrequête sur cette table.

Chaque instance MySQL a une base de données information_schema. Si vous exécutez la requête suivante, elle donnera des détails complets sur la table, y compris le nombre approximatif de lignes dans cette table.

select * from information_schema.TABLES where table_name = 'table_name'\G
Santhosh Tangudu
la source
Est-ce également plus rapide sur une table MyISAM puisque MyISAM stocke le nombre de lignes?
NaturalBornCamper
Je n'ai jamais testé cela sur MyISAM.
Santhosh Tangudu
6

Simplement:

SELECT COUNT(*) FROM `tablename`
David Snabel-Caunt
la source
5
select count(*) from YourTable
Adriaan Stander
la source
3

Faites juste un

SELECT COUNT(*) FROM table;

Vous pouvez spécifier des conditions avec un Où après cela

SELECT COUNT(*) FROM table WHERE eye_color='brown';
Suanbit
la source
3

Si vous avez plusieurs champs dans votre table et que votre table est énorme, il vaut mieux NE PAS UTILISER * car cela charge tous les champs en mémoire et l'utilisation de ce qui suit aura de meilleures performances

SELECT COUNT(1) FROM fooTable;
Yuseferi
la source
Ceci est une erreur. Voir stackoverflow.com/questions/5179969/… COUNT (1) peut en fait être beaucoup plus lent pour MyISAM.
jcoffland
@jcoffland vous pouvez essayer t par moi-même, surtout lorsque vous avez une jointure ou lorsque les conditions sont beaucoup plus rapides que count (*).
Yuseferi
2

Comme mentionné par Santosh , je pense que cette requête est suffisamment rapide, sans interroger toute la table.

Pour renvoyer le résultat entier du nombre d'enregistrements de données, pour un nom de table spécifique dans une base de données particulière :

select TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA = 'database' 
AND table_name='tablename';
Mohammad Kanan
la source
1
Cela peut renvoyer un nombre estimé de lignes. Dans un exemple, j'ai obtenu 55 940 343 lignes en utilisant COUNT (*) mais 56 163 339 en utilisant cette méthode, donc elle était décalée de plus de 200 Ko.
jcoffland
@jcoffland, j'ai mentionné la réponse de _ Santosh_ ci-dessus qui indique que le résultat est approximatif . Ma réponse est une question pratique plus détaillée. C'est assez clair pour toutes les réponses si vous voulez une utilisation précise du comptage count(*)avec une prise en compte des performances
Mohammad Kanan
1
$sql="SELECT count(*) as toplam FROM wp_postmeta WHERE meta_key='ICERIK' AND post_id=".$id;
$total = 0;
$sqls = mysql_query($sql,$conn);
if ( $sqls ) {
    $total = mysql_result($sqls, 0);
};
echo "Total:".$total;`
alpc
la source
Cette réponse est obsolète, mysql_result est obsolète en PHP 5.5.0 et supprimé en PHP 7.0.0
Rendre ce monde meilleur le
1

Vous devez utiliser count () renvoie le nombre de lignes qui correspond à un critère spécifié

select count(*) from table_name;
éruptions cutanées
la source
0

Si vous avez une clé primaire ou une clé / index unique, la méthode la plus rapide possible (Testé avec 4 millions de tables de lignes)

SHOW INDEXES FROM "database.tablename" WHERE Key_Name=\"PRIMARY\"

puis obtenir le champ de cardinalité (il est proche de l'instant)

Temps où de 0,4 s à 0,0001 ms

hamboy75
la source