Der Unterschied zwischen MySQL count(1), count(*) und count(field)

Der Unterschied zwischen MySQL count(1), count(*) und count(field)

Bezüglich der Zeilenanzahl in der Datenbank verfügen sowohl MySQL als auch Oracle über eine verwendbare Funktion namens COUNT.

Diese häufig verwendete COUNT-Funktion birgt jedoch viele Geheimnisse, insbesondere bei Vorstellungsgesprächen, und kann leicht missbraucht werden, wenn Sie nicht vorsichtig sind. Wenn Sie mir nicht glauben, versuchen Sie bitte, die folgenden Fragen zu beantworten:

> 1. Wie viele Verwendungsmöglichkeiten hat COUNT?
> 2. Was ist der Unterschied zwischen den Abfrageergebnissen von COUNT(Feldname) und COUNT(*)?
> 3. Was ist der Unterschied zwischen COUNT(1) und COUNT(*)?
> 4. Was ist effizienter, COUNT(1) oder COUNT(*)?
> 5. Warum empfiehlt das Alibaba Java Development Manual die Verwendung von COUNT(*)?
> 6. Welche Optimierungen nimmt die MyISAM-Engine von MySQL an COUNT(*) vor?
> 7. Welche Optimierungen nimmt die InnoDB-Engine von MySQL an COUNT(*) vor?
> 8. Was ist die wichtigste Voraussetzung für die oben erwähnte MySQL-Optimierung von COUNT(*)?
> 9. Macht es beim Ausführen von SELECT COUNT(*) einen Unterschied, ob eine Where-Bedingung hinzugefügt wird oder nicht?
> 10. Wie erfolgt die Ausführung von COUNT(*), COUNT(1) und COUNT(Feldname)?
Wenn Sie alle oben genannten 10 Fragen richtig beantworten können, bedeutet das, dass Sie die COUNT-Funktion wirklich verstehen.

1. Erster Blick auf COUNT

1. COUNT(Ausdruck) gibt die Anzahl der von der SELECT-Anweisung abgerufenen Zeilen zurück, bei denen der Wert von Ausdruck ungleich NULL ist. Das Ergebnis ist ein BIGINT-Wert.

2. Wenn das Abfrageergebnis keinen Datensatz findet, wird 0 zurückgegeben.

3. Es ist jedoch zu beachten, dass die statistischen Ergebnisse von COUNT(*) die Anzahl der Zeilen mit NULL-Werten enthalten.

Zusätzlich zu COUNT(id) und COUNT(*) können Sie auch COUNT(constant) (z. B. COUNT(1)) verwenden, um die Anzahl der Zeilen zu zählen. Was sind also die Unterschiede zwischen diesen drei SQL-Anweisungen? Welches ist effizienter? Warum verbietet das Alibaba Java Development Manual die Verwendung von COUNT(Spaltenname) oder COUNT(Konstante) anstelle von COUNT(*)?

2. Der Unterschied zwischen COUNT(Feld), COUNT(Konstante) und COUNT(*)

COUNT(Konstante) und COUNT(*) geben an, dass direkt die Anzahl der Zeilen in der Datenbanktabelle abgefragt wird, die die Bedingungen erfüllen.

COUNT(Spaltenname) gibt die Anzahl der Zeilen an, deren Werte der Spalten, die die Bedingungen erfüllen, nicht NULL sind.

COUNT(*) ist die in SQL92 definierte Standardsyntax zum Zählen von Zeilen. Da es sich um eine Standardsyntax handelt, wurde die MySQL-Datenbank stark optimiert.

SQL92 ist ein ANSI/ISO-Standard für Datenbanken. Es definiert eine Sprache (SQL) und das Verhalten der Datenbank (Transaktionen, Isolationsebenen usw.).

3. Optimierung von COUNT(*)

MySQL verwendet hauptsächlich zwei Ausführungs-Engines:

  • InnoDB-Engine
  • MyISAM-Engine

MyISAM unterstützt keine Transaktionen und die Sperren in MyISAM sind Sperren auf Tabellenebene, während InnoDB Transaktionen und Sperren auf Zeilenebene unterstützt.

MeinIsAM

MyISAM hat eine einfache Optimierung vorgenommen, indem die Gesamtzahl der Zeilen in der Tabelle separat aufgezeichnet wird. Wenn count(*) ausgeführt wird, kann es direkt zurückgegeben werden, sofern keine Where-Bedingung vorliegt. MyISAM verwendet Sperren auf Tabellenebene und es gibt keine gleichzeitigen Zeilenoperationen, daher sind die Ergebnisse genau.

InnoDB

InnoDB kann diese Art von Cache-Operation nicht verwenden, da es Transaktionen unterstützt und die meisten Operationen Zeilensperren sind. Zeilen können parallel geändert werden, sodass die Cache-Datensätze ungenau sind.

InnoDB hat jedoch einige Optimierungen für die COUNT(*)-Anweisung vorgenommen.

Durchsuchen Sie die Tabelle über kostengünstige Indizes, ohne auf den spezifischen Inhalt der Tabelle zu achten.

Indizes in InnoDB sind in Clustered-Indizes (Primärschlüsselindizes) und Nicht-Clustered-Indizes (Nicht-Primärschlüsselindizes) unterteilt. Die Blattknoten von Clustered-Indizes speichern die gesamte Datensatzzeile, während die Blattknoten von Nicht-Clustered-Indizes die Primärschlüsselwerte der Datensatzzeile speichern.

MySQL wählt zum Scannen der Tabelle vorrangig den kleinsten nicht gruppierten Index aus.

Die Voraussetzung der Optimierung besteht darin, dass die Abfrageanweisung keine Where-Bedingungen und Group-By-Bedingungen enthält.

4. COUNT(*) und COUNT(1)

In der offiziellen MySQL-Dokumentation heißt es:

InnoDB behandelt SELECT COUNT(*)- und SELECT COUNT(1)-Operationen auf die gleiche Weise. Es gibt keinen Leistungsunterschied.

Daher ist die MySQL-Optimierung für count(1) und count(*) genau dieselbe und es stellt sich nicht die Frage, was schneller ist!

Es wird jedoch weiterhin empfohlen, count(*) zu verwenden, da dies die von SQL92 definierte Standardsyntax zum Zählen von Zeilen ist.

5.COUNT(Feld)

Führen Sie einen vollständigen Tabellenscan durch, um zu ermitteln, ob der Wert des angegebenen Felds NULL ist. Wenn nicht, fügen Sie es hinzu.

Die Leistung ist langsamer als count(1) und count(*).

6. Zusammenfassung

Die Funktion COUNT wird hauptsächlich verwendet, um die Anzahl der Zeilen in einer Tabelle zu zählen. Die wichtigsten Verwendungen sind COUNT(*), COUNT(Feld) und COUNT(1).

Da COUNT(*) die in SQL92 definierte Standardsyntax zum Zählen von Zeilen ist, wurden in MySQL viele Optimierungen dafür vorgenommen. MyISAM zeichnet die Gesamtzahl der Zeilen in der Tabelle für COUNT(*)-Abfragen direkt auf, während InnoDB beim Scannen der Tabelle den kleinsten Index auswählt, um Kosten zu sparen. Die Prämisse dieser Optimierungen ist natürlich, dass es keine Where- und Group-Bedingungsabfrage gibt.

In InnoDB gibt es keinen Unterschied bei der Implementierung von COUNT(*) und COUNT(1) und die Effizienz ist dieselbe, aber COUNT(Feld) erfordert eine Nicht-NULL-Prüfung des Felds, sodass die Effizienz geringer ist.

Da COUNT(*) die von SQL92 definierte Standardsyntax zum Zählen von Zeilen ist und eine hohe Effizienz aufweist, verwenden Sie bitte COUNT(*) direkt, um die Anzahl der Zeilen in der Tabelle abzufragen!

Referenzlink: Die COUNT-Anweisung von MySQL kann vom Interviewer so sehr gequält werden! ?

Dies ist das Ende dieses Artikels über die Unterschiede zwischen MySQL count(1), count(*) und count(field). Weitere Informationen zu MySQL count(1), count(*) und count(field) finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Zusammenfassung der Unterschiede zwischen count(*), count(1) und count(col) in MySQL
  • Analyse des Unterschieds zwischen Select Count und MySQL-Kenntnissen
  • Detaillierte Einführung in den Unterschied zwischen count() und sum() in MySQL

<<:  Drei Beispiele für Unschärfe-Hintergrundeffekte mit CSS3

>>:  Eine kurze Analyse der Grundkonzepte von HTML-Webseiten

Artikel empfehlen

Fehler bei der Eingabe chinesischer Zeichen im Flex-Programm Firefox

In niedrigeren Versionen von Firefox können keine ...

Größe von PNG-Bildern mit CSS-Maske deutlich optimieren (empfohlen)

Dieser Artikel darf gerne geteilt und zusammengef...

Zusammenfassung und Analyse häufig verwendeter Docker-Befehle und Beispiele

Inhalt 1. Container-Lebenszyklusmanagement (1) Do...

Detaillierte Erklärung der NodeJS-Modularität

Inhaltsverzeichnis 1. Einleitung 2. Haupttext 2.1...

So lösen Sie das Problem, dass Seata die MySQL 8-Version nicht verwenden kann

Mögliche Gründe: Der Hauptgrund, warum Seata MySQ...

MySQL extrahiert interne JSON-Felder und gibt sie als Zahlen aus.

Inhaltsverzeichnis Hintergrund Problemanalyse 1. ...

Vue realisiert die Palastgitterrotationslotterie

Vue implementiert die Palastgitterrotationslotter...

Implementierung des Wasserfall-Layouts im Uni-App-Projekt

GitHub-Adresse, Sie können es mit einem Stern mar...

Detaillierte Erläuterung der kombinierten MySQL-Indexmethode

Für jedes DBMS sind die Indizes der wichtigste Op...

Handtrack.js-Bibliothek zur Echtzeitüberwachung von Handbewegungen (empfohlen)

【Einführung】: Handtrack.js ist eine Prototypbibli...

So zeigen Sie den Speicherort von MySQL-Datendateien an

Wir haben möglicherweise eine Frage: Nachdem wir ...

Verstehen Sie JavaScript-Prototypen und Prototypenketten gründlich

Inhaltsverzeichnis Vorwort Den Grundstein legen P...

Sammlung von 25 Schriftarten, die in berühmten Website-Logos verwendet werden

In diesem Artikel sind die Schriftarten zusammeng...