So analysieren Sie den SQL-Ausführungsplan in MySQL mit EXPLAIN

So analysieren Sie den SQL-Ausführungsplan in MySQL mit EXPLAIN


Vorwort

In MySQL können wir den Befehl EXPLAIN verwenden, um Informationen darüber zu erhalten, wie MySQL SELECT-Anweisungen ausführt, einschließlich der Art und Weise, wie Tabellen verbunden werden, und der Reihenfolge, in der sie während der Ausführung der SELECT-Anweisung verbunden werden.

Im Folgenden werden die einzelnen Spalten des EXPLAIN-Befehlsergebnisses beschrieben:

.select_type: gibt den Typ von SELECT an. Übliche Werte sind:

Typ veranschaulichen
EINFACH Einfache Tabellen, keine Tabellenverknüpfungen oder Unterabfragen
PRIMÄR Die Hauptabfrage, also die äußere Abfrage
UNION Die zweite oder nachfolgende Abfrage in einer UNION
UNTERABFRAGE Die erste in der Unterabfrage

.table: Tabelle des Ausgabeergebnissatzes (Tabellenalias)

.type: Gibt an, wie MySQL die erforderliche Zeile in der Tabelle findet oder den Zugriffstyp. Die gängigen Zugriffstypen sind wie folgt (von oben nach unten, Leistung von der schlechtesten zur besten):


ALLE Vollständiger Tabellenscan
Index Vollständiger Indexscan
Reichweite Indexbereichsscan
Referenz Nicht eindeutiger Indexscan
eq_ref Eindeutiger Index-Scan
Konstante,System Es gibt höchstens eine übereinstimmende Zeile in einer einzelnen Tabelle
NULL Es sind keine Tabellen- oder Indexscans erforderlich

1. Typ = ALLE, vollständiger Tabellenscan, MySQL durchsucht die gesamte Tabelle, um übereinstimmende Zeilen zu finden

Im Allgemeinen gibt es keine Where-Bedingung oder die Where-Bedingung verwendet nicht die Indexabfrageanweisung

EXPLAIN SELECT * FROM Kunde WHERE aktiv=0; 

2. Typ = Index, vollständiger Index-Scan. MySQL durchsucht den gesamten Index, um übereinstimmende Zeilen abzufragen, und scannt die Tabelle nicht.

Im Allgemeinen werden die Abfragefelder indiziert.

ERKLÄREN SIE, WÄHLEN SIE STORE-ID VOM KUNDEN;

3. Typ = Bereich, Indexbereichsscan, häufig verwendet für <, <=, >, >=, zwischen und andere Operationen

ERKLÄREN SIE, SELECT * FROM Kunde WHERE Kunden-ID>=10 AND Kunden-ID<=20; 

Beachten Sie, dass die in diesem Fall verglichenen Felder indexiert werden müssen. Wenn kein Index vorhanden ist, führt MySQL einen vollständigen Tabellenscan durch. Im folgenden Fall ist beispielsweise das Feld create_date nicht indexiert:

EXPLAIN SELECT * FROM Kunde WHERE create_date>='2006-02-13'; 

4. type=ref, verwenden Sie einen nicht eindeutigen Index oder einen Präfix-Scan eines eindeutigen Indexes, um Zeilen zurückzugeben, die einem einzelnen Wert entsprechen

Das Feld store_id hat einen normalen Index (nicht eindeutiger Index).

ERKLÄREN SIE: SELECT * FROM Kunde WHERE store_id=10; 

Ref-Typen kommen auch häufig in Join-Operationen vor:

Fragen Sie die Kunden- und Zahlungstabellen mit den zugehörigen Feldern customer.customer_id (Primärschlüssel) und payment.customer_id (nicht eindeutiger Index) ab. Beim Abfragen von Tabellenzuordnungen muss eine Tabelle vollständig gescannt werden. Diese Tabelle muss die Tabelle mit der geringsten Anzahl von Datensatzzeilen unter den Tabellen sein. Anschließend werden die übereinstimmenden Zeilen in anderen verknüpften Tabellen über nicht eindeutige Indizes gefunden, um die Mindestanzahl gescannter Zeilen zu erreichen, wenn die Tabellen verknüpft sind.

Da die Kundentabelle die geringste Zeilenanzahl in den Kunden- und Zahlungstabellen aufweist, wird die Kundentabelle vollständig gescannt und die Zahlungstabelle sucht über einen nicht eindeutigen Index nach übereinstimmenden Zeilen.

EXPLAIN SELECT * FROM Kunde Kunde INNER JOIN Zahlung Zahlung ON Kunde.Kunden-ID = Zahlung.Kunden-ID; 

5. type=eq_ref, ähnlich wie ref, außer dass der verwendete Index ein eindeutiger Index ist. Für jeden Indexschlüsselwert gibt es nur einen übereinstimmenden Datensatz in der Tabelle.

eq_ref erscheint normalerweise, wenn mehrere Tabellen verknüpft sind und der Primärschlüssel oder ein eindeutiger Index als Verknüpfungsbedingung verwendet wird.

Die Assoziationsabfrage der Tabellen „Film“ und „Filmtext“ ist grundsätzlich dieselbe wie die im vorherigen Punkt erwähnte, mit der Ausnahme, dass die Assoziationsbedingung von einem nicht eindeutigen Index in einen Primärschlüssel geändert wird.

EXPLAIN SELECT * FROM Film Film INNER JOIN Filmtext Filmtext ON Film.Film_ID = Filmtext.Film_ID; 

6. Typ = const/System: In einer einzelnen Tabelle gibt es höchstens eine übereinstimmende Zeile, und die Abfrage ist sehr schnell, sodass die Werte anderer Spalten dieser übereinstimmenden Zeile vom Optimierer in der aktuellen Abfrage als Konstanten behandelt werden können.

const/system erscheint in Abfragen basierend auf dem Primärschlüssel oder einem eindeutigen Index

Abfrage basierend auf dem Primärschlüssel:

ERKLÄREN SIE, SELECT * FROM Kunde WHERE Kunden-ID =10; 

Abfrage basierend auf eindeutigem Index:

EXPLAIN SELECT * FROM Kunde WHERE E-Mail = '[email protected]'; 

7. Typ=NULL, MySQL kann das Ergebnis direkt abrufen, ohne auf die Tabelle oder den Index zuzugreifen.

.possible_keys: gibt den Index an, der für die Abfrage verwendet werden kann

.key: Der tatsächlich verwendete Index

.key_len: Die Länge des verwendeten Indexfeldes

.ref: Welche Spalte oder Konstante zusammen mit dem Schlüssel verwendet werden soll, um Zeilen aus der Tabelle auszuwählen.

.rows: Die Anzahl der gescannten Zeilen

.gefiltert: Der Prozentsatz der Anzahl der Datensätze, die die Abfrage erfüllen, nachdem die vom Speicher-Engine zurückgegebenen Daten auf Serverebene gefiltert wurden.

.Extra: Beschreibung und Beschreibung der Ausführung, einschließlich zusätzlicher Informationen, die nicht zur Anzeige in anderen Spalten geeignet sind, aber für den Ausführungsplan sehr wichtig sind

Die drei wichtigsten sind:


Verwenden des Index Zeigt die Indexabdeckung an, es wird keine Tabellenabfrage durchgeführt
Verwenden von „Where“ Zeigt an, dass eine Tabellenabfrage durchgeführt wurde
Verwenden der Indexbedingung Zeigt an, dass eine ICP-Optimierung durchgeführt wurde
Flesort verwenden Zeigt an, dass MySQL zusätzliche Sortiervorgänge erfordert und den Sortiereffekt nicht durch die Indexreihenfolge erzielen kann

Was ist ICP?

MySQL 5.6 führte die Index Condition Pushdown (ICP)-Funktion ein, um Abfragen weiter zu optimieren. Pushdown bedeutet, dass Vorgänge dezentralisiert werden und in einigen Fällen bedingte Filtervorgänge auf die Speicher-Engine dezentralisiert werden.

EXPLAIN SELECT * FROM Miete WHERE Mietdatum='2005-05-25' AND Kunden-ID>=300 AND Kunden-ID<=400;

Vor Version 5.6:

Der Optimierer verwendet zunächst den zusammengesetzten Index idx_rental_date, um die Datensätze herauszufiltern, die die Bedingung rental_date='2005-05-25' erfüllen, kehrt dann zur Tabelle zurück, um die Datensätze basierend auf dem zusammengesetzten Index idx_rental_date abzurufen, und filtert schließlich die endgültigen Abfrageergebnisse basierend auf den Bedingungen customer_id>=300 AND customer_id<=400 heraus (abgeschlossen auf der Serviceebene).

Nach Version 5.6:

MySQL verwendet ICP, um Abfragen weiter zu optimieren. Während des Abrufs werden die Bedingungen customer_id>=300 AND customer_id<=400 auch an die Speicher-Engine-Ebene weitergeleitet, um die Filterung abzuschließen, wodurch unnötige IO-Zugriffe reduziert werden können. Wenn „Extra“ Using index condition steht, bedeutet dies, dass die ICP-Optimierung verwendet wird.

siehe

MySQL in einfachen Worten

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung des MySQL-Ausführungsplans
  • Detaillierte Analyse des Explain-Ausführungsplans in MySQL
  • Detaillierte Analyse von MySQL-Ausführungsplänen
  • Detaillierte Erklärung: Die MySQL-Ausführungsplan-ID ist leer (Schlüsselwort UNION).
  • Detaillierte Erläuterung des Ausführungsplans, Beispiel für einen Befehl in MySQL
  • So verwenden Sie „Explain“, um den SQL-Ausführungsplan in MySql abzufragen
  • Einführung in den MySQL-Ausführungsplan
  • MySQL erklärt den Ausführungsplan
  • Erfahren Sie mehr über den MySQL-Ausführungsplan

<<:  So erstellen Sie schnell einen FTP-Dateidienst mit FileZilla

>>:  Wie implementiert Vue die Kommunikation zwischen Komponenten?

Artikel empfehlen

JavaScript-Wissen: Konstruktoren sind auch Funktionen

Inhaltsverzeichnis 1. Definition und Aufruf des K...

CSS fügt Scroll zu Div hinzu und verbirgt die Bildlaufleiste

CSS fügt dem div Scrollen hinzu und verbirgt die ...

So installieren Sie Graphviz und beginnen mit dem Tutorial unter Windows

Herunterladen und installierenUmgebungsvariablen ...

Analyse der HTTP-Dienstschritte auf einer virtuellen VMware-Maschine

1. Verwenden Sie xshell, um eine Verbindung mit d...

nuxt.js Konfiguration mehrerer Umgebungsvariablen

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

So stellen Sie Node.js mit Docker bereit

Vorwort Node wird als mittlere Schicht im Projekt...

Eine kurze Diskussion über die Verwendung und Analyse von Nofollow-Tags

Kontroverse um Nofollow Zwischen Zac und Guoping ...

Detaillierte Erklärung der MySQL 30-Militärregeln

1. Grundlegende Spezifikationen (1) Es muss die I...

So aktualisieren Sie CentOS7 auf CentOS8 (detaillierte Schritte)

Dieser Artikel erläutert anhand eines konkreten B...

So verwenden Sie ein Domestic Image Warehouse für Docker

1. Problembeschreibung Aus bestimmten Gründen ist...