Details zum MySQL-Index-Pushdown

Details zum MySQL-Index-Pushdown

Vorwort:

Index Pushdown (ICP) ist eine Optimierung für Situationen, in denen MySQL Indizes verwendet, um Zeilen aus einer Tabelle abzurufen.

  • Wenn kein Index-Pushdown erfolgt, verwendet MySQL die Speicher-Engine, um den Index zu durchlaufen, die Datenzeilen in der Tabelle zu finden und sie an den MySQL-Server zurückzugeben. Der Server ermittelt dann die WHERE-Bedingung, um zu bestätigen, ob die Datenzeile zum Ergebnissatz hinzugefügt werden soll.
  • Wenn Index-Pushdown aktiviert ist und ein Teil der WHERE-Bedingung nur mithilfe von Spalten im Index ausgewertet werden kann, überträgt der MySQL-Server diesen Teil der WHERE-Bedingung an die Speicher-Engine, die dann die Indexeinträge zum Auswerten der übertragenen Indexbedingung verwendet und nur dann aus der Tabelle liest, wenn die Bedingung erfüllt ist.

Durch Index-Pushdown kann die Anzahl der Zugriffe der Speicher-Engine auf die Datentabelle und die Anzahl der Zugriffe des MySQL-Servers auf die Speicher-Engine reduziert werden.

Sind Sie immer noch ein wenig verwirrt? Das stimmt. Es besteht kein Zweifel, dass der obige Absatz ziemlich schwer zu verstehen ist, aber lassen Sie sich bitte nicht entmutigen. Ich werde die am einfachsten zu verstehende Sprache verwenden, um Ihnen zu zeigen, wie Sie Index-Pushdown verstehen.

Um es zusammenzufassen:

  • Prinzip des äußersten linken Präfixes
  • Zurück zur Tabelle

1. Prinzip des ganz linken Präfixes

MySQL folgt beim Erstellen eines gemeinsamen Index dem Prinzip des am weitesten links stehenden Präfixes. Beispielsweise wird jetzt ein gemeinsamer Index (ID, Name, Alter) für die Tabelle „User“ erstellt. Gemäß dem Prinzip des am weitesten links stehenden Präfixes kann dieser gemeinsame Index nur verwendet werden, wenn der Bedingungsteil des SQL (ID), (ID, Name) oder ( id , name , age ) ergibt.

Der Index kann in folgenden Situationen verwendet werden:

Wählen Sie * FROM USER WHERE id = 1

SELECT * FROM USER WHERE id = 1 und name = 'zhangsan'

SELECT * FROM USER WHERE id = 1 und Name = 'zhangsan' und Alter = 18

In den folgenden Situationen kann der Index nicht verwendet werden:

Wählen Sie * vom Benutzer aus, wobei Name = "zhangsan" ist.

SELECT * FROM USER WHERE Alter = 18

SELECT * FROM USER WHERE Name = 'zhangsan' und Alter = 18

Bei einem gemeinsamen Index führt mysql den Abgleich nach rechts weiter aus, bis es auf eine Bereichsabfrage (>, <, between , like ) stößt und den Abgleich beendet.

2. Zurück zur Tabelle

MySQL unterstützt unter der InnoDB -Engine zwei Arten von Indizes:

  • Clustered-Index: Der Index (auf den Blattknoten des B+-Baums) speichert Datenzeilen (echte Daten).
  • Normaler Index: Der Primärschlüssel wird im Index gespeichert (auf dem Blattknoten des B+-Baums).

Hier konzentrieren wir uns auf Clustered-Indizes. Die offizielle Dokumentation enthält die folgende Beschreibung

  • InnoDB verwendet den Primärschlüssel als gruppierten Index für Tabellen mit Primärschlüsseln.
  • Für Tabellen ohne Primärschlüssel verwendet InnoDB den ersten eindeutigen Index als Clustered-Index.
  • Wenn kein Primärschlüssel oder eindeutiger Index vorhanden ist, generiert MySQL ein verstecktes 6-Byte- row ID Feld als gruppierten Index.

Wenn MySQL nicht alle Daten auf einmal über normale Indizes abrufen kann, erhält es den Primärschlüsselwert über normale Indizes und sucht dann den Datensatz im Clustered-Index über den Primärschlüsselwert. Dieser Vorgang wird als Tabellenabruf bezeichnet. Sie können die Anzahl der Tabellenrückgaben verringern, indem Sie einen überdeckenden Index erstellen. Wenn Sie beispielsweise einen Namen anhand einer ID-Nummer suchen möchten, können Sie einen gemeinsamen Index aus ID-Nummer und Name ( id , name ) erstellen. Wenn Sie eine Abfrage durchführen, können Sie den Wert des name direkt über diesen Index abrufen, und Sie müssen nicht im gruppierten Index suchen. Dies ist ein überdeckender Index.

3. Index-Pushdown

Erstellen Sie zuerst eine Benutzertabelle

CREATE TABLE `student` (
  `id` int(11) NICHT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `Alter` int DEFAULT 0,
  `Klasse` varchar(255) DEFAULT NULL,
  Primärschlüssel (`id`),
  SCHLÜSSEL `index_two` (`Name`,`Alter`)
)ENGINE=InnoDB;

//Fügen Sie dieser Tabelle einen zusammengesetzten Index (`Name`,`Alter`) hinzu

Einfügen von Daten in die Tabelle

INSERT INTO `student` (`Name`, `Alter`, `Klasse`) VALUES ('pengpeng', 21, '1');
INSERT INTO `student` (`Name`, `Alter`, `Klasse`) VALUES ('pengpeng', 22, '2');
INSERT INTO `student` (`Name`, `Alter`, `Klasse`) VALUES ('pengpeng', 23, '3');
INSERT INTO `student` (`Name`, `Alter`, `Klasse`) VALUES ('pengpeng', 24, '4');
INSERT INTO `student` (`Name`, `Alter`, `Klasse`) VALUES ('pengpeng', 25, '5');


Die in die Abfrage eingefügten Daten lauten wie folgt

Erklären Sie als nächstes das folgende SQL

Erläutern Sie „Select * from student“, wobei der Name beispielsweise „peng%“ und das Alter 23 sind.


Sie können sehen, dass das Feld Extra als USING INDEX CONDITION angezeigt wird, was darauf hinweist, dass dieses SQL Index-Pushdown verwendet. Lassen Sie uns die obige SQL-Anweisung analysieren:

Vor MySQL 5.6 konnten Sie nur die Zeilen finden, die die Bedingungen im Namensfeld erfüllen, und dann damit beginnen, zur Tabelle zurückzukehren, die Datenzeilen im gruppierten Index zu finden, dann das Altersfeld zu vergleichen und die qualifizierten Daten zum Ergebnissatz hinzuzufügen.

Die Index-Pushdown-Optimierung wurde in MySQL 5.6 eingeführt. Während des Index-Traversierungsprozesses werden zuerst die im Index enthaltenen Felder beurteilt. Hier wird das Altersfeld beurteilt. Schließen Sie die Datenzeilen, die die Altersfeldanforderungen nicht erfüllen, direkt aus und reduzieren Sie dadurch die Anzahl der Tabellenrückgaben.

Fragen- und Antwortbereich

Frage 1: Wenn die zusammengesetzte Indexspalte (Name, Alter, Adresse) lautet, kann das folgende SQL den Index verwenden?

Wählen Sie * vom Studenten, wobei der Name beispielsweise „peng%“ und das Alter 23 ist.


Ja, wenn auf „like“ gestoßen wird, wird die Übereinstimmung nachfolgender Elemente unterbrochen, aber nur das Namensfeld kann verwendet werden. MySQL führt die Übereinstimmung nach rechts weiter aus, bis es auf eine Bereichsabfrage (>, <, between, like) stößt und die Übereinstimmung beendet. Die Bereichsspalte kann den Index verwenden, aber die Spalten, die der Bereichsspalte folgen, können den Index nicht verwenden. Das heißt, der Index wird höchstens für eine Bereichsspalte verwendet. Wenn in der Abfragebedingung also zwei Bereichsspalten vorhanden sind, kann der Index nicht vollständig genutzt werden.

Frage 2: Kann Index-Pushdown nur in gemeinsamen Indizes existieren?

Ja, Index-Pushdown ist bei nicht verknüpften Indizes nicht möglich.

Frage 3: In welchen Situationen kann Index-Pushdown nicht verwendet werden?

Pushdown-Bedingung bei Unterabfrage angetroffen

Pushdown-Bedingungsfunktion

Nicht-InnoDB-Tabellen und MyISAM-Tabellen

Frage 4 : Wie schalte ich den Index-Pushdown ein und aus?

// Index-Pushdown ist standardmäßig aktiviert set optimizer_switch='index_condition_pushdown=off'; // Deaktivieren set optimizer_switch='index_condition_pushdown=on'; // Aktivieren

Zusammenfassen

Die Optimierung des Index-Pushdowns für Nicht-Primärschlüsselindizes kann die Anzahl der Tabellenrückgaben effektiv reduzieren und die Effizienz von Abfragen erheblich verbessern. In der täglichen Arbeit können Sie Index-Pushdown verwenden, um den Geschäftsdurchsatz zu verbessern, indem Sie die Indizes entsprechend den Geschäftsbedingungen optimieren.

Dies ist das Ende dieses ausführlichen Artikels über MySQL-Index-Pushdown. Weitere relevante MySQL-Index-Pushdown-Inhalte finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Detaillierte Analyse der MySQL-Indexdatenstruktur
  • Detaillierte Erklärung der Transaktionen und Indizes in der MySQL-Datenbank
  • MySQL hilft Ihnen, Index-Pushdown in Sekunden zu verstehen
  • MySQL-Index-Pushdown in fünf Minuten verstehen
  • Ein Artikel zum Verständnis von MySQL Index Pushdown (ICP)
  • MySQL-Interviewfragen: So richten Sie Hash-Indizes ein

<<:  CSS verwendet die BEM-Namenskonvention

>>:  Detaillierte Einführung in das CSS-Prioritätswissen

Artikel empfehlen

Implementierung der Nginx-Lastverteilung/SSL-Konfiguration

Was ist Lastenausgleich? Wenn ein Domänenname auf...

Analyse der Nutzung des Xmeter API-Schnittstellentesttools

XMeter API bietet einen umfassenden Online-Schnit...

Lösen Sie das Problem des Ablaufs des TLS-Zertifikats (SSL) von Docker

Problemphänomen: [root@localhost ~]# Docker-Image...

Beschreibung der HTML-Meta-Viewport-Attribute

Was ist ein Ansichtsfenster? Mobile Browser platz...

Tutorial zum Ändern des Root-Passworts in MySQL 5.7

Versionsupdate, das Passwortfeld im Originalbenut...

Analyse des HTTP-Schnittstellentestprozesses basierend auf Postman

Ich habe zufällig ein tolles Tutorial zum Thema k...

Verwenden von js zum Implementieren eines einfachen Lichtschaltercodes

Körperteil: <button>Licht ein-/ausschalten&...

Eine kurze Analyse zum Upgrade von PHP 5.4 auf 5.6 in CentOS 7

1. Überprüfen Sie die PHP-Version nach dem Aufruf...

nuxt.js Konfiguration mehrerer Umgebungsvariablen

Inhaltsverzeichnis 1. Einleitung 2. Szenario 3. S...

Achten Sie bei der Webseitenerstellung auf die Verwendung von HTML-Tags

Dieser Artikel stellt einige Aspekte von HTML-Tag...

Linux Cron geplante Ausführung von PHP-Code mit Parametern

1. Verwenden Sie zur Ausführung weiterhin ein PHP...

Eine Zusammenfassung der Fuzzy-Abfrage von MySQL wie

1. Allgemeine Verwendung: (1) Mit % verwenden % s...

Müssen die Texte der Website noch gestaltet werden?

Viele fragen sich vielleicht: Muss der Text auf d...