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

Installieren Sie das Linux-System automatisch basierend auf Cobbler

1. Komponenten installieren yum install epel-rpm-...

Führt diese SQL-Schreibmethode wirklich dazu, dass der Index fehlschlägt?

Vorwort Im Internet gibt es häufig Artikel, die v...

So verwenden Sie reguläre Ausdrucksabfragen in MySql

Reguläre Ausdrücke werden häufig verwendet, um Te...

Teilen Sie JS vier lustige Hacker-Hintergrundeffektcodes

Inhaltsverzeichnis Beispiel 1 Beispiel 2 Beispiel...

Lösung für das MySQL-Fehlerproblem 1045 (28000)

Ich bin auf den MySQL-FEHLER 1045 gestoßen und ha...

So verwenden Sie ein Domestic Image Warehouse für Docker

1. Problembeschreibung Aus bestimmten Gründen ist...

JavaScript Canvas realisiert den Effekt des Neun-Quadrat-Rasterschneidens

In diesem Artikel wird der spezifische Code der L...

Beispielcode zur Implementierung der Alipay-Sandbox-Zahlung mit Vue+SpringBoot

Laden Sie zunächst eine Reihe von Dingen aus der ...

So steuern Sie die Startreihenfolge von Docker Compose-Diensten

Zusammenfassung Docker-Compose kann problemlos me...

JavaScript BOM erklärt

Inhaltsverzeichnis 1. BOM-Einführung 1. JavaScrip...

Detailliertes Tutorial zur Installation von Anaconda3 auf Ubuntu 18.04

Anaconda bezeichnet eine Open-Source-Python-Distr...