Optimierte Implementierung von count() für große MySQL-Tabellen

Optimierte Implementierung von count() für große MySQL-Tabellen

Das Folgende ist mein Urteil basierend auf der Datenstruktur des B+-Baums und meiner Spekulation über die experimentellen Ergebnisse. Wenn es Fehler gibt, korrigieren Sie mich bitte!

Heute habe ich mit der Optimierung der MySQL count()-Operation experimentiert. Die folgende Diskussion basiert auf der MySQL 5.7 InnoDB-Speicher-Engine und dem x86-Windows-Betriebssystem.

Die Struktur der erstellten Tabelle ist wie folgt (die Datenmenge beträgt 1 Million):

表結構

Zunächst stellt sich die Frage, welches der MySQL-Verfahren count(*), count(PK) und count(1) schneller ist.
Die Ergebnisse sind wie folgt:

這里寫圖片描述

這里寫圖片描述

這里寫圖片描述

Es gibt keinen Unterschied! Nach dem Hinzufügen der WHERE-Klausel ist auch die Zeit für die drei Abfragen gleich, daher werde ich die Bilder nicht veröffentlichen.

Als ich vorher in der Firma gearbeitet habe, habe ich eine SQL-Anweisung „ select count(*) from table geschrieben, die bei vielen Daten sehr langsam war. Wie kann es also optimiert werden?

Dies beginnt mit dem InnoDB-Index. Der InnoDB-Index ist B+Tree.

Für den Primärschlüsselindex gilt: Er speichert nur Daten auf Blattknoten, sein Schlüssel ist der Primärschlüssel und sein Wert sind die gesamten Daten .
Bei Hilfsindizes gilt: „Schlüssel“ ist die Spalte zum Erstellen des Index und „Wert“ ist der Primärschlüssel.

Dadurch erhalten wir zwei Informationen:
1. Die gesamten Daten werden nach dem Primärschlüssel gefunden
2. Nur der Primärschlüssel kann basierend auf dem Sekundärindex gefunden werden, und dann müssen die restlichen Informationen über den Primärschlüssel gefunden werden.

Wenn wir also die count(*)-Operation optimieren möchten, müssen wir eine kurze Spalte finden und einen sekundären Index dafür erstellen.
In meinem Fall ist es status , obwohl sein „Schweregrad“ fast 0 ist.

Erstellen Sie zuerst einen Index: ALTER TABLE test1 ADD INDEX ( status );
Führen Sie dann die Abfrage wie unten gezeigt durch:

這里寫圖片描述

Es ist ersichtlich, dass die Abfragezeit von 3,35 s auf 0,26 s gesunken ist und die Abfragegeschwindigkeit um fast das 13-fache zugenommen hat.

Wenn der Index die str Spalte ist, was ist das Ergebnis?
Erstellen Sie zuerst einen Index: alter table test1 add index (str)
Die Ergebnisse sind wie folgt:

這里寫圖片描述

Wie Sie sehen, beträgt die Zeit 0,422 s, was ebenfalls sehr schnell ist, aber immer noch etwa 1,5-mal langsamer als status .

Um etwas mutiger zu sein, werde ich ein Experiment durchführen. Ich werde den Index der status löschen, einen gemeinsamen Index von status und left(omdb,200) erstellen (diese Spalte hat durchschnittlich 1000 Zeichen) und dann die Abfragezeit überprüfen.
Erstellen Sie einen Index: alter table test1 add index ( status ,omdb(200))
Die Ergebnisse sind wie folgt:

這里寫圖片描述

Die Zeit beträgt 1,172 s

Tabelle ändern test1, Index hinzufügen (Status, Imdbid);

Nachfüllen! !
Seien Sie vorsichtig bei Indexfehlern!
Nachdem der Index erstellt wurde, sieht er folgendermaßen aus:

這里寫圖片描述

Sie können sehen, dass key_len 6 ist und die Beschreibung von Extra einen Index verwendet.

Wenn der Index fehlschlägt:

這里寫圖片描述

Es gibt viele Situationen, in denen Indizes ungültig werden, z. B. bei der Verwendung von Funktionen, !=-Operationen usw. Einzelheiten finden Sie in der offiziellen Dokumentation.

Ich habe MySQL nicht eingehend untersucht und das Obige basiert auf meiner Beurteilung auf der Grundlage der B+-Baumdatenstruktur und Spekulationen über experimentelle Ergebnisse. Wenn es Fehler gibt, korrigieren Sie mich bitte!

Dies ist das Ende dieses Artikels über die optimierte Implementierung von count() für große MySQL-Tabellen. Weitere relevante Inhalte zur count()-Optimierung für große MySQL-Tabellen 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:
  • Nutzungs- und Leistungsoptimierungstechniken für die Aggregatfunktion „count“ in MySQL
  • Austausch über Probleme bei der Zähloptimierung in InnoDB in MySQL
  • Lassen Sie uns über die Leistung von MySQLs COUNT(*) sprechen.
  • 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

<<:  Häufige Fehler beim Schreiben von HTML-Tags

>>:  Webentwicklungs-Tutorial: domänenübergreifende Lösung – detaillierte Erläuterung

Artikel empfehlen

So legen Sie in Linux eine feste IP fest (getestet und effektiv)

Öffnen Sie zunächst die virtuelle Maschine Öffnen...

Die Bedeutung des Statuscodes im HTTP-Protokoll

Ein Statuscode, der eine vorläufige Antwort anzei...

Verständnis und Anwendungsszenarien von Enumerationstypen in TypeScript

Inhaltsverzeichnis 1. Was ist 2. Verwendung Numer...

Tomcat erhält den Clientdomänennamen des Nginx-Reverse-Proxys

Frage Nach dem Nginx-Reverse-Proxy erhält die Tom...

Detaillierte Erklärung zur Installation und Verwendung von Vue-Router

Inhaltsverzeichnis Installieren Grundlegende Konf...

So installieren Sie ROS Noetic in Ubuntu 20.04

Haftungsausschluss: Da das Projekt die Verwendung...

Tutorial zur Installation von MySQL 8.0.11 mit RPM unter Linux (CentOS7)

Inhaltsverzeichnis 1. Installationsvorbereitung 1...

vue.config.js Verpackungsoptimierungskonfiguration

Die Informationen auf Baidu sind so vielfältig, d...

isPrototypeOf-Funktion in JavaScript

Inhaltsverzeichnis 1. istPrototyp von() Beispiel ...

Implementierung der Vue-Anmeldefunktion

Inhaltsverzeichnis Vorne geschrieben Anmeldeübers...