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; # Es dauerte 0,572 Sekunden, select count(1) von t6; # Es dauerte 0,580 Sekunden, um count(id) von t6 auszuwählen; # Es dauerte 0,620 Sekunden, um count(*) vom T6-Force-Index (primär) auszuwählen. 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; Erklären Sie „Select count(1)“ von t6. Warnungen anzeigen; Erklären Sie „Select count(id) from t6“. Warnungen anzeigen; Erklären Sie „Select Count(*)“ vom T6-Force-Index (primär). Warnungen anzeigen; Aus dem obigen Experiment können wir die folgenden drei Erkenntnisse ziehen:
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“. 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
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:
|
<<: 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
<div ausrichten="zentrieren"> <...
Vorwort Um dem herkömmlichen WEB-Layout zu folgen...
1. Komponenten installieren yum install epel-rpm-...
Vorwort Im Internet gibt es häufig Artikel, die v...
Reguläre Ausdrücke werden häufig verwendet, um Te...
Was ist ein absteigender Index? Sie kennen sich v...
Inhaltsverzeichnis Beispiel 1 Beispiel 2 Beispiel...
Textkarussells sind in unserem täglichen Leben we...
Ich bin auf den MySQL-FEHLER 1045 gestoßen und ha...
1. Problembeschreibung Aus bestimmten Gründen ist...
In diesem Artikel wird der spezifische Code der L...
Laden Sie zunächst eine Reihe von Dingen aus der ...
Zusammenfassung Docker-Compose kann problemlos me...
Inhaltsverzeichnis 1. BOM-Einführung 1. JavaScrip...
Anaconda bezeichnet eine Open-Source-Python-Distr...