Tabellenzeilen zählen


165

Was ist der MySQL-Befehl, um die Anzahl der Datensätze in einer Tabelle abzurufen?

Antworten:


236
SELECT COUNT(*) FROM fooTable;

zählt die Anzahl der Zeilen in der Tabelle.

Siehe das Referenzhandbuch .


7
Ist es schneller, wenn ich den Namen der indizierten Spalte anstelle von * verwende? So: SELECT COUNT (id) FROMtablename

1
Nur geringfügig. Ich habe eine Zeilentabelle 21961904 erhalten, die sein COUNT in 115 Sekunden abgefragt hat, während die Verwendung der ID 107 Sekunden dauerte.
Bondolin

2
COUNT (*) ist eine strenge Sprachdefinition. Sie erhalten einen Analysefehler, wenn Sie COUNT (*) versuchen, das Leerzeichen zu
notieren

9
Sie können dies tun COUNT(1), dies wird der schnellste Weg sein.
Shota Papiashvili

Was ist der beste Weg, um mit COUNT () eine Variable in PHP zu schreiben? Mache ich "... COUNT (*) AS rowCount ..." in der SQL, verwendet es $ results-> num_rows oder gibt es eine Möglichkeit, dieses Ergebnis direkt aufzurufen?
Nosajimiki

71

Weil es niemand erwähnt hat:

show table status;

listet alle Tabellen zusammen mit einigen zusätzlichen Informationen auf, einschließlich der geschätzten Zeilen für jede Tabelle. Dies ist, was phpMyAdmin für seine Datenbankseite verwendet.

Diese Informationen sind in MySQL 4 verfügbar, wahrscheinlich auch in MySQL 3.23 - lange Zeit vorhergehende Informationsschemadatenbank.

AKTUALISIEREN:

Da es zu Abstimmungen gekommen ist, möchte ich klarstellen, dass die angezeigte Anzahl für InnoDB und TokuDB geschätzt wird und für MyISAM- und Aria (Maria) -Speicher-Engines absolut korrekt ist.

Gemäß der Dokumentation :

Die Anzahl der Zeilen. Einige Speicher-Engines wie MyISAM speichern die genaue Anzahl. Bei anderen Speicher-Engines wie InnoDB ist dieser Wert eine Annäherung und kann vom tatsächlichen Wert um bis zu 40% bis 50% abweichen. Verwenden Sie in solchen Fällen SELECT COUNT (*), um eine genaue Zählung zu erhalten.

Dies ist auch der schnellste Weg, um die Zeilenanzahl unter MySQL zu sehen, da Abfragen wie folgt lauten:

select count(*) from table;

Durchführen eines vollständigen Tabellenscans, was sehr teuer sein kann und auf einem großen Hochlast-Server Stunden dauern kann. Es erhöht auch die Festplatten-E / A.

Dieselbe Operation blockiert möglicherweise die Tabelle für Einfügungen und Aktualisierungen - dies geschieht nur bei exotischen Speicher-Engines.

InnoDB und TokuDB sind mit der Tabellensperre in Ordnung, benötigen jedoch einen vollständigen Tabellenscan.


3
Dies scheint die effizienteste Methode zum Zählen von Zeilen zu sein. Ich frage mich, warum es nicht die Antwort ist? Ich benutze InnoDB. Mit der Tabellensperre sollte die Anzahl der Zeilen genau richtig sein?
Chung Lun Yuen

für innodb wird es geschätzt . Sie können es jedoch in einigen Fällen verwenden: "Unsere Website hat xxx Mitglieder", "Wir haben ähnliche xxx-Ergebnisse wie Sie festgestellt" und so weiter.
Nick

Ich bin nicht sicher. aber für Innodb zählt das nicht wirklich. Ist aber sehr nützlich für Millionen Zeilentabellen.
Nick

4
Es ist ziemlich lächerlich, durch Tabellen zu gehen, um jede Zeile zu zählen, um eine Zeilenanzahl zu erhalten. Deshalb bevorzuge ich auch diese Antwort.
th3penguinwhisperer

35

Wir haben eine andere Möglichkeit, die Anzahl der Zeilen in einer Tabelle zu ermitteln, ohne eine selectAbfrage für diese Tabelle auszuführen .

Jede MySQL-Instanz verfügt über eine information_schema-Datenbank. Wenn Sie die folgende Abfrage ausführen, werden vollständige Details zur Tabelle einschließlich der ungefähren Anzahl von Zeilen in dieser Tabelle angezeigt.

select * from information_schema.TABLES where table_name = 'table_name'\G

Ist dies auch in einer MyISAM-Tabelle schneller, da MyISAM die Anzahl der Zeilen speichert?
NaturalBornCamper

Ich habe dies nie auf MyISAM getestet.
Santhosh Tangudu



3

Mach einfach eine

SELECT COUNT(*) FROM table;

Danach können Sie Bedingungen mit einem Wo angeben

SELECT COUNT(*) FROM table WHERE eye_color='brown';

3

Wenn Sie mehrere Felder in Ihrer Tabelle haben und Ihre Tabelle sehr groß ist, ist es besser, NICHT ZU VERWENDEN, * da alle Felder in den Speicher geladen werden und die Verwendung der folgenden Felder eine bessere Leistung bietet

SELECT COUNT(1) FROM fooTable;

Das ist falsch. Siehe stackoverflow.com/questions/5179969/… COUNT (1) kann für MyISAM tatsächlich viel langsamer sein.
Jcoffland

@jcoffland Sie können es selbst versuchen, besonders wenn Sie einen Join haben oder wenn die Bedingungen viel schneller sind als count (*).
Yuseferi

2

Wie von Santosh erwähnt , ist diese Abfrage meiner Meinung nach angemessen schnell, ohne die gesamte Tabelle abzufragen.

So geben Sie ein ganzzahliges Ergebnis der Anzahl von Datensätzen für einen bestimmten Tabellennamen in einer bestimmten Datenbank zurück :

select TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA = 'database' 
AND table_name='tablename';

1
Dies kann eine geschätzte Anzahl von Zeilen zurückgeben. In einem Beispiel habe ich 55.940.343 Zeilen mit COUNT (*) erhalten, aber 56.163.339 mit dieser Methode, sodass die Anzahl um mehr als 200.000 gesunken ist.
Jcoffland

@jcoffland, ich erwähnte die Antwort von Santosh, die besagt, dass das Ergebnis ungefähr ist . Meine Antwort ist eine detailliertere praktische Frage. Es ist ziemlich klar über die Antworten hinweg, wenn Sie eine präzise Verwendung der Zählung count(*)mit Leistungsbewusstsein wünschen
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;`

Diese Antwort ist veraltet, mysql_result ist in PHP 5.5.0 veraltet und in PHP 7.0.0 entfernt
Machen Sie diese Welt zu einem besseren Ort

1

Sie müssen count () verwenden, um die Anzahl der Zeilen zurückzugeben, die einem bestimmten Kriterium entsprechen

select count(*) from table_name;

0

Wenn Sie einen Primärschlüssel oder einen eindeutigen Schlüssel / Index haben, ist die Methode schneller (getestet mit 4 Millionen Zeilentabellen).

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

und dann Kardinalitätsfeld erhalten (es ist fast augenblicklich)

Zeiten von 0,4 s bis 0,0001 ms

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.