Lassen Sie uns über die Leistung von MySQLs COUNT(*) sprechen.

Lassen Sie uns über die Leistung von MySQLs COUNT(*) sprechen.

Vorwort

Im Grunde verwenden Programmierer am Arbeitsplatz count(*), count(1) oder count(Primärschlüssel), um die Anzahl der Zeilen in einer Datenbanktabelle zu zählen. Kennen Sie die Unterschiede und die Leistung zwischen ihnen?

Tatsächlich ist es für Programmierer während des Entwicklungsprozesses eine sehr zeitaufwändige Aufgabe, die Gesamtzahl der Zeilen in einer großen Tabelle zu zählen. Welche Methode sollten wir also verwenden, um schneller zu zählen?

Lassen Sie uns als Nächstes über die Methode und Leistung zum Zählen der Gesamtzahl der Zeilen in MySQL sprechen.

Was ist schneller: count(*), count(1) oder count(Primärschlüssel)?

1. Erstellen Sie eine Tabelle und fügen Sie 10 Millionen Datensätze für experimentelle Tests ein:

# Erstellen Sie eine Testtabelle CREATE TABLE `t6` (
 `id` int(11) NICHT NULL AUTO_INCREMENT,
 `name` varchar(50) NICHT NULL,
 `status` tinyint(4) NICHT NULL,
 Primärschlüssel (`id`),
 SCHLÜSSEL `idx_status` (`status`)
)ENGINE=InnoDB STANDARD-CHARSET=utf8;

# Erstellen Sie eine gespeicherte Prozedur zum Einfügen von 1000w-Daten CREATE PROCEDURE insert_1000w()
BEGINNEN
  Erklären Sie, dass ich INT;
  Setze i = 1;
  WÄHREND i<=10000000 DO
    INSERT INTO t6(Name, Status) VALUES('Gott-Jiang-666', 1);
    Setze i = i + 1;
  ENDE WÄHREND;
ENDE;

#Rufen Sie die gespeicherte Prozedur auf, um 10 Millionen Datenzeilen einzufügen: call insert_1000w();

2. Analysieren Sie die experimentellen Ergebnisse

# Es dauerte 0,572 Sekunden, select count(*) von t6; 

Bildbeschreibung hier einfügen

# Es dauerte 0,572 Sekunden, select count(1) von t6; 

Bildbeschreibung hier einfügen

# Es dauerte 0,580 Sekunden, um count(id) von t6 auszuwählen; 

Bildbeschreibung hier einfügen

# Es dauerte 0,620 Sekunden, um count(*) vom T6-Force-Index (primär) auszuwählen. 

Bildbeschreibung hier einfügen

Aus dem obigen Experiment können wir schließen, dass count(*) und count(1) am schnellsten sind, gefolgt von count(id). Am langsamsten ist es, wenn count einen obligatorischen Primärschlüssel verwendet .

Lassen Sie uns weiterhin ihre jeweiligen Ausführungspläne testen:

Erklären Sie „Select count(*) von t6“.
Warnungen anzeigen; 

Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen

Erklären Sie „Select count(1)“ von t6.
Warnungen anzeigen; 

Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen

Erklären Sie „Select count(id) from t6“.
Warnungen anzeigen; 

Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen

Erklären Sie „Select Count(*)“ vom T6-Force-Index (primär).
Warnungen anzeigen; 

Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen

Aus dem obigen Experiment können wir die folgenden drei Erkenntnisse ziehen:

  1. Der MySQL-Abfrageoptimierer schreibt count(*) in count(0) um und wählt den Index idx_status aus.
  2. Sowohl count(1) als auch count(id) wählen den idx_statux-Index aus
  3. Nach dem Hinzufügen des Force-Index (primär) wird der Forced-Index verwendet.

Dieser idx_status entspricht einem sekundären Hilfsindexbaum. Sein Zweck besteht darin, zu veranschaulichen, dass InnoDB bei der Verarbeitung von count(*) und wenn ein Hilfsindexbaum vorhanden ist, dem Hilfsindexbaum Priorität beim Zählen der Gesamtzahl der Zeilen einräumt.

Um die Schlussfolgerung zu überprüfen, dass count(*) dem Hilfsindexbaum Priorität einräumt, fahren wir mit dem folgenden Experiment fort:

# Löschen Sie den idx_status-Index und fahren Sie mit der Ausführung von count(*) fort.
Tabelle t6 ändern, Index idx_status löschen;

Erklären Sie „Select count(*) von t6“. 

Bildbeschreibung hier einfügen

Aus dem obigen Experiment können wir schließen, dass count(*) den Primärschlüsselindex verwendet, wenn der Hilfsindexbaum idx_status gelöscht wird. Die Schlussfolgerung lautet also: count(*) gibt dem Hilfsindex Priorität. Wenn kein Hilfsindex vorhanden ist, wird der Primärschlüsselindex verwendet.

Warum bevorzugt count(*) sekundäre Indizes?

Vor MySQL 5.7.18 verarbeitete InnoDB count(*)-Anweisungen durch Scannen des gruppierten Index.

Ab MySQL 5.7.18 verarbeitet InnoDB COUNT(*)-Anweisungen, indem es den kleinsten verfügbaren sekundären Index durchläuft. Wenn kein sekundärer Index vorhanden ist, wird der gruppierte Index gescannt.

Warum verwendet die neue Version sekundäre Indizes zur Verarbeitung von count(*)?

Da die Blattknoten des sekundären InnoDB-Indexbaums den Primärschlüssel speichern und die Blattknoten des Primärschlüssel-Indexbaums die gesamte Datenzeile speichern, ist der sekundäre Indexbaum kleiner als der Primärschlüssel-Indexbaum. Daher priorisiert der Abfrageoptimierer aus Kostengründen sekundäre Indizes. Daher ist der Index count(*) schneller als count(Primärschlüssel).

Zusammenfassen

Die Schlussfolgerung dieses Artikels lautet count(*)=count(1)>count(id) .

Warum ist count(id) ohne den Primärschlüsselindex langsamer? Denn count(id) muss den Primärschlüssel abrufen, dann prüfen, ob er leer ist, und ihn dann akkumulieren, was teurer ist.

Count(*) zählt alle NOT NULL- und NULL-Felder, während count(id) keine NULL-Felder zählt. Daher sollten wir beim Erstellen von Tabellen versuchen, NOT NULL zu verwenden und den Standardwert leer zu lassen.

Wenn Sie in Zukunft die Anzahl der Zeilen in einer Datenbanktabelle addieren möchten, können Sie getrost count(*) oder count(1) verwenden.

Verweise

  • Kapitel 6 von „High Performance MySQL“ (3. Ausgabe) Optimieren von COUNT()-Abfragen
  • "MySQL-Praxis 45 Vorlesungen" von Lin Xiaobin

Dies ist das Ende dieses Artikels über die Leistung von MySQL COUNT(*). Weitere Informationen zu MySQL COUNT(*) finden Sie in früheren Artikeln auf 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:
  • Optimierte Implementierung von count() für große MySQL-Tabellen
  • Nutzungs- und Leistungsoptimierungstechniken für die Aggregatfunktion „count“ in MySQL
  • Austausch über Probleme bei der Zähloptimierung in InnoDB in MySQL
  • Detaillierte Erklärung zur korrekten Verwendung der Zählfunktion in MySQL
  • Eine kurze Diskussion über die MySQL-Zeilenanzahl
  • Zusammenfassung der Methoden zur Verbesserung der MySQL-Anzahl
  • Detaillierte Erklärung der Zählung ohne Filterbedingungen in MySQL
  • Zusammenfassung der Unterschiede zwischen count(*), count(1) und count(col) in MySQL
  • Detaillierte Erläuterung von MySQL-Zähldatenbeispielen in mehreren Tabellen
  • Verwendung und Optimierung der MySQL COUNT-Funktion

<<:  Beschränken Sie die Eingabe in HTML-Textfelder auf Zahlen und Dezimalstellen.

>>:  Verwenden Sie Nicht-Root-Benutzer, um Skriptvorgänge in Docker-Containern auszuführen

Artikel empfehlen

Spezifische Verwendung von Docker Anonymous Mount und Named Mount

Inhaltsverzeichnis Datenvolumen Anonyme und benan...

Berechnungstabelle für die RGBA-Alpha-Transparenzkonvertierung

Konvertierung zwischen RGBA- und Filterwerten unt...

Detaillierte Erklärung zur Verwendung des Linux-Befehls mpstat

1. mpstat-Befehl 1.1 Befehlsformat mpstat [ -A ] ...

So implementieren Sie eine MySQL-Master-Slave-Replikation basierend auf Docker

Vorwort Die MySQL Master-Slave-Replikation ist di...

Detaillierte Erklärung zur Installation der PHP-Curl-Erweiterung unter Linux

Dieser Artikel beschreibt, wie man die PHP-Curl-E...

Ausführliches Tutorial zur Installation von Deepin in VMware15 (Bild und Text)

Vorwort Die Benutzeroberfläche von Deepin sieht w...

Zusammenfassung des Speicherorts und Tipps für Docker-Konfigurationscontainer

Tipps zur Verwendung von Docker 1. Bereinigen Sie...

Analyse des Prinzips und der Erstellungsmethode der temporären MySQL-Tabelle

In diesem Artikel werden hauptsächlich das Prinzi...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.7.27

Detailliertes Download-, Installations- und Konfi...

Details zu gängigen Javascript-Funktionen höherer Ordnung

Inhaltsverzeichnis 1. Gemeinsame Funktionen höher...

So installieren Sie mysql5.6 in Docker unter Ubuntu

1. Installieren Sie mysql5.6 Docker führt MySQL a...