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

Detaillierte Schritte zur Installation von MySQL 8.0.18-winx64 unter Win10

1. Gehen Sie zunächst auf die offizielle Website,...

Detaillierte Erklärung der CSS-Animationsattribut-Keyframes

Wie lange ist es her, dass ich meine Kolumne aktu...

MySQL-Datenbankbeschränkungen und Prinzipien des Datentabellenentwurfs

Inhaltsverzeichnis 1. Datenbankbeschränkungen 1.1...

So entwickeln Sie Java 8 Spring Boot-Anwendungen in Docker

In diesem Artikel zeige ich Ihnen, wie Sie mit Ja...

Dockers flexible Implementierung zum Aufbau einer PHP-Umgebung

Verwenden Sie Docker, um eine flexible Online-PHP...

Der Unterschied zwischen schreibgeschützt und deaktiviert

Um es zusammenzufassen: „Nur lesen“ ist nur für Ei...

Eine ausführliche Zusammenfassung der Überlegungen zu MySQL-Zeiteinstellungen

Existiert die Zeit wirklich? Manche Menschen glau...

Grafisches Tutorial zur Installation und Verwendung von MySQL 5.7.17

MySQL ist ein relationales Datenbankverwaltungssy...

MySQL extrahiert interne JSON-Felder und gibt sie als Zahlen aus.

Inhaltsverzeichnis Hintergrund Problemanalyse 1. ...

Detailliertes Tutorial zur Installation von SonarQube mit Docker

Inhaltsverzeichnis 1. Ziehen Sie das Bild 1.1 Zie...

Implementierung zum Erstellen benutzerdefinierter Images mit Dockerfile

Inhaltsverzeichnis Vorwort Einführung in Dockerfi...

CSS-Implementierungscode für verzerrte Schatten

Dieser Artikel stellt den Implementierungscode vo...

Detaillierte Analyse der Rolle von HTML-Kommentar-Tags <!--...-->

Wenn wir den Quellcode vieler Websites überprüfen...