Einfaches Verständnis und Beispiele für MySQL Index Pushdown (ICP)

Einfaches Verständnis und Beispiele für MySQL Index Pushdown (ICP)

Vorwort

Index Condition Pushdown (ICP) ist eine neue Funktion von MySQL 5.6. Sie kann die Anzahl der Tabellenabfragen reduzieren und die Abrufeffizienz verbessern.

MySQL-Architektur

Um Index-Pushdown zu verstehen, müssen Sie zunächst die Architektur von MySQL verstehen:

Das obige Bild stammt aus der offiziellen MySQL-Dokumentation.

MySQL wird üblicherweise von oben nach unten in die folgenden Schichten unterteilt:

  • MySQL-Serviceschicht: umfasst NoSQL- und SQL-Schnittstellen, Abfrageparser, Optimierer, Cache, Puffer und andere Komponenten.
  • Speicher-Engine-Ebene: Verschiedene Plug-in-Tabellenspeicher-Engines, die verschiedene Speicher-Engine-bezogene Funktionen wie Transaktionen und Indizes implementieren.
  • Dateisystemebene: Lesen und Schreiben physischer Dateien.

Die MySQL-Serviceschicht ist für die SQL-Syntaxanalyse, Trigger, Ansichten, integrierte Funktionen, Binärprotokolle, die Generierung von Ausführungsplänen usw. verantwortlich und ruft die Speicher-Engine-Schicht auf, um Daten zu speichern und abzurufen. Das „nach unten“ in „Index Push Down“ bedeutet tatsächlich, dass einige der Aufgaben, die in der Verantwortung der oberen Schicht (Serviceschicht) liegen, zur Verarbeitung an die untere Schicht (Speicher-Engine) übergeben werden.

Beispiel für Index-Pushdown

Nehmen Sie an, dass die Daten und die Struktur der Benutzertabelle wie folgt sind:

Ausweis Alter Geburtstag Name
1 18 01-01 Benutzer1
2 19 03-01 Benutzer2
3 20 03-01 Benutzer3
4 einundzwanzig 03-01 Benutzer4
5 zweiundzwanzig 05-01 Benutzer5
6 18 06-01 Benutzer6
7 vierundzwanzig 01-01 Benutzer7

Erstellen Sie einen gemeinsamen Index (Alter, Geburtstag) und fragen Sie Benutzer ab, die älter als 20 Jahre sind und am 01.03. Geburtstag haben:

Wählen Sie * vom Benutzer aus, wobei Alter > 20 und Geburtstag = "03-01"

Da das Altersfeld eine Bereichsabfrage verwendet, kann in diesem Fall gemäß dem Prinzip des ganz linken Präfixes nur das Altersfeld für die Bereichsabfrage verwendet werden, das Geburtstagsfeld im Index kann jedoch nicht verwendet werden. Verwenden Sie „explain“, um den Ausführungsplan anzuzeigen:

+------+----------+----------+-----------+---------------+---------------+--------+------+------+---------+---------+-----------+---------+-----------------------+
| ID | Auswahltyp | Tabelle | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | Extra |
+------+----------+----------+-----------+---------------+---------------+--------+------+------+---------+---------+-----------+---------+-----------------------+
| 1 | SIMPLE | Benutzer | Bereich | Alter_Geburtstag | Alter_Geburtstag | 4 | NULL | 3 | Indexbedingung wird verwendet |
+------+----------+----------+-----------+---------------+---------------+--------+------+------+---------+---------+-----------+---------+-----------------------+

Es ist ersichtlich, dass, obwohl der Index age_birthday verwendet wird, die Indexlänge key_len nur 4 beträgt, was bedeutet, dass nur das Altersfeld des gemeinsamen Index wirksam ist (da das Altersfeld vom Typ int ist und 4 Bytes belegt). Schließlich gibt die Bedingung „Index verwenden“ in der Spalte „Extra“ an, dass diese Abfrage die Index-Pushdown-Optimierung verwendet.

So führen Sie die folgenden Schritte ohne Index-Pushdown aus:

  • Die Speicher-Engine findet die Benutzer-IDs mit einem Alter von >20 Jahren gemäß dem Index, nämlich: 4, 5, 7
  • Die Speicher-Engine ruft die drei Datensätze mit der ID (4,5,7) aus der Tabelle ab und gibt sie an die Serviceebene zurück.
  • Die Serviceebene filtert die Datensätze heraus, die die Bedingung „Geburtstag = „01.03.““ nicht erfüllen, und gibt schließlich als Abfrageergebnis eine Datensatzzeile mit der ID = 4 zurück.

Wenn die Index-Pushdown-Optimierung aktiviert ist, lauten die Ausführungsschritte wie folgt:

  1. Die Speicher-Engine findet die Benutzer-IDs, deren Alter gemäß dem Index > 20 ist, und verwendet das Geburtstagsfeld im Index, um Datensätze herauszufiltern, die die Bedingung „Geburtstag = 01.03.“ nicht erfüllen, und erhält schließlich die ID = 4.
  2. Die Speicher-Engine ruft einen Datensatz mit der ID=4 aus der Tabelle ab und gibt ihn an die Serviceebene zurück.
  3. Die Serviceebene filtert die Datensätze heraus, die die Bedingung „Geburtstag = „01.03.““ nicht erfüllen, und gibt schließlich als Abfrageergebnis eine Datensatzzeile mit der ID = 4 zurück.

Nach dem Aktivieren des Index-Pushdowns wird die Where-Bedingung zur Ausführung von der MySQL-Dienstebene auf die Speicher-Engine-Ebene verschoben. Der Vorteil besteht darin, dass die Speicher-Engine basierend auf der ID weniger oft Daten aus der Tabelle liest. Wenn im obigen Beispiel kein Index-Pushdown stattfindet, muss die Tabelle noch zweimal abgefragt werden. Darüber hinaus handelt es sich bei Tabellenabfragen wahrscheinlich um diskrete E/A, was die Datenbankleistung in einigen Fällen erheblich verbessern kann.

Zusammenfassen

Damit ist dieser Artikel über das einfache Verständnis und die Beispiele von MySQL Index Pushdown (ICP) abgeschlossen. Weitere relevante Inhalte zu MySQL Index Pushdown (ICP) 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:
  • MySQL-Index-Pushdown in fünf Minuten verstehen
  • Ein Artikel zum Verständnis von MySQL Index Pushdown (ICP)
  • Lernen Sie MySQL Index Pushdown in fünf Minuten
  • MySQL hilft Ihnen, Index-Pushdown in Sekunden zu verstehen

<<:  Der Implementierungscode des CSS3-Eingabefelds ähnelt dem Animationseffekt der Google-Anmeldung

>>:  Mit dem Befehl docker prune können Sie selten genutzte Daten regelmäßig bereinigen.

Artikel empfehlen

Häufig verwendete HTML-Format-Tags_Powernode Java Academy

1. Titel HTML definiert sechs <h>-Tags: <...

Detaillierte Schritte zur Installation von MinIO auf Docker

Inhaltsverzeichnis 1. Überprüfen Sie, ob die Dock...

So erstellen Sie eine Swap-Partitionsdatei in Linux

Einführung in Swap Swap (d. h. Swap-Partition) in...

Docker löst das Problem, dass das Terminal kein Chinesisch eingeben kann

Vorwort: Eines Tages baute ich einen MySQL-Dienst...

Vue implementiert die Produktregisterkarte der Produktdetailseitenfunktion

In diesem Artikelbeispiel wird der spezifische Co...

So fügen Sie einer großen MySQL-Tabelle eine Spalte hinzu

Die Frage wird hier zitiert: https://www.zhihu.co...

Einige Erfahrungen zum Aktivieren von HTTPS

Da sich die heimische Netzwerkumgebung immer weit...

So installieren Sie eine MySQL-Datenbank unter Ubuntu

Ubuntu ist ein kostenloses und quelloffenes Deskt...

Detaillierte Erklärung zur JavaScript-Datenabflachung

Inhaltsverzeichnis Was ist Abflachung? Rekursion ...

Detaillierte Erklärung der HTML-Programmier-Tags und der Dokumentstruktur

Der Zweck der Verwendung von HTML zum Markieren v...