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

Installieren Sie mysql5.7 unter Ubuntu 18.04

Ubuntu 18.04 installiert MySQL 5.7 zu Ihrer Infor...

So entwerfen und optimieren Sie MySQL-Indizes

Inhaltsverzeichnis Was ist ein Index? Prinzip der...

Verwenden Sie die mail()-Funktion von PHP zum Senden von E-Mails

Senden von E-Mails mit der Mail-Funktion von PHP ...

HTML verwendet reguläre Ausdrücke zum Testen von Tabellenbeispielen

Hier ist ein Beispielcode für die Verwendung regu...

Kompatibilitätsprobleme mit CSS3-Farbverlaufshintergründen

Wenn wir eine Hintergrundfarbe mit Farbverlauf er...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.11

Die Installations- und Konfigurationsmethoden von...

MYSQL Eine Frage zur Verwendung von Zeichenfunktionen zum Filtern von Daten

Problembeschreibung: Struktur: test hat zwei Feld...

Schnelle Lösung zum Vergessen des MySQL8-Passworts

Vorwort Wenn wir das MySQL-Datenbankkennwort verg...

Schritte eines hervorragenden Registrierungsprozesses

Für eine Website ist dies die grundlegendste Funkt...

...

So richten Sie eine VSCode-Remoteverbindung zum Server-Docker-Container ein

Inhaltsverzeichnis Ziehen Sie das Bild Ausführen ...

Beispielschritte zur Verwendung von AntV X6 mit Vue.js

Inhaltsverzeichnis 0x0 Einführung 0x1 Installatio...