So verwenden Sie „Explain“, um den SQL-Ausführungsplan in MySql abzufragen

So verwenden Sie „Explain“, um den SQL-Ausführungsplan in MySql abzufragen

Der Befehl „Explain“ ist die primäre Möglichkeit, um zu sehen, wie der Abfrageoptimierer entschieden hat, eine Abfrage auszuführen.

Diese Funktion weist Einschränkungen auf und liefert nicht immer die Wahrheit, doch die Ausgabe enthält die besten verfügbaren Informationen und es lohnt sich, sich die Zeit zu nehmen, sie zu verstehen, da Sie erfahren, wie die Abfrage ausgeführt wird.

1. Was ist ein MySQL-Ausführungsplan?

Um den Ausführungsplan besser zu verstehen, müssen Sie über ein grundlegendes Verständnis der Basisstruktur von MySQL und der grundlegenden Abfrageprinzipien verfügen.

Die funktionale Architektur von MySQL selbst ist in drei Teile unterteilt: Anwendungsschicht, Logikschicht und physische Schicht. Nicht nur MySQL, sondern auch die meisten anderen Datenbankprodukte sind entsprechend dieser Architektur unterteilt.

Die Anwendungsschicht ist hauptsächlich für die Interaktion mit dem Client, das Herstellen von Links, das Speichern des Linkstatus, das Zurückgeben von Daten und das Antworten auf Anfragen verantwortlich. Diese Schicht befasst sich mit dem Client.

Die Logikschicht ist hauptsächlich für die Abfrageverarbeitung, das Transaktionsmanagement und die Verarbeitung anderer Datenbankfunktionen am Beispiel von Abfragen verantwortlich.

Nach dem Empfang der SQL-Abfrage weist die Datenbank sofort einen Thread zu, der sie verarbeitet. Im ersten Schritt optimiert der Abfrageprozessor die SQL-Abfrage. Nach der Optimierung wird ein Ausführungsplan generiert und dann zur Ausführung an den Planausführer übergeben.

Der Planausführer muss auf den Transaktionsmanager und Speichermanager der unteren Ebene zugreifen, um Daten zu verarbeiten. Ihre jeweilige Arbeitsteilung ist unterschiedlich. Letztendlich erhalten sie die Abfragestrukturinformationen, indem sie die Dateien der physischen Ebene aufrufen und die Endergebnisse an die Anwendungsebene weiterleiten.

Die physische Schicht bezieht sich auf die auf der tatsächlichen physischen Festplatte gespeicherten Dateien, hauptsächlich Datendateien und Protokolldateien.

Aus der obigen Beschreibung geht hervor, dass das Erstellen eines Ausführungsplans ein wesentlicher Schritt bei der Ausführung einer SQL-Anweisung ist. Die Leistung einer SQL-Anweisung lässt sich intuitiv anhand des Ausführungsplans erkennen. Der Ausführungsplan bietet verschiedene Abfragetypen und -ebenen, die wir anzeigen und als Grundlage für die Leistungsanalyse verwenden können.

2. So analysieren Sie den Ausführungsplan

MySQL stellt uns das Schlüsselwort „explain“ zur Verfügung, um den Ausführungsplan einer SQL-Anweisung intuitiv anzuzeigen.

Explain zeigt, wie MySQL Indizes verwendet, um Auswahlanweisungen zu verarbeiten und Tabellen zu verknüpfen. Dies kann Ihnen dabei helfen, bessere Indizes auszuwählen und optimiertere Abfrageanweisungen zu schreiben.

Als nächstes verwenden wir „explain“, um eine Abfrage wie folgt zu stellen:

mysql> erklären Sie „select * from payment“;
+----+----------+---------+------------+------+---------------+-----+---------+---------+------+---------+-------+----------+----------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+---------+------------+------+---------------+-----+---------+---------+------+---------+-------+----------+----------+
| 1 | EINFACH | Zahlung | NULL | ALLE | NULL | NULL | NULL | NULL | 16086 | 100,00 | NULL |
+----+----------+---------+------------+------+---------------+-----+---------+---------+------+---------+-------+----------+----------+
1 Zeile im Satz, 1 Warnung (0,01 Sek.)

Die Abfragestruktur besteht aus 12 Spalten. Das Verständnis der Bedeutung jeder Spalte ist entscheidend für das Verständnis des Ausführungsplans. Nachfolgend finden Sie eine Erklärung in Tabellenform.

Spaltenname veranschaulichen
Ausweis SELECT-Kennung, die die Abfragesequenznummer des SELECT ist.
Wählen Sie Typ

SELECT-Typ, der einer der folgenden sein kann:

  • SIMPLE: Einfaches SELECT (ohne UNION oder Unterabfrage)

  • PRIMARY: das äußerste SELECT

  • UNION: Die zweite oder nachfolgende SELECT-Anweisung in einer UNION

  • DEPENDENT UNION: Die zweite oder nachfolgende SELECT-Anweisung in einer UNION hängt von der äußeren Abfrage ab

  • UNION-ERGEBNIS: Das Ergebnis von UNION

  • SUBQUERY: Die erste SELECT-Anweisung in einer Unterabfrage

  • ABHÄNGIGE UNTERABFRAGE: Die erste SELECT-Anweisung in einer Unterabfrage, die von der äußeren Abfrage abhängt.

  • DERIVED: SELECT der exportierten Tabelle (Unterabfrage in der FROM-Klausel)

Tisch Die Tabelle, auf die in der Ausgabezeile verwiesen wird
Partitionen Wenn sich die Abfrage auf eine partitionierte Tabelle bezieht, werden die Partitionen angezeigt, auf die die Abfrage zugreift.
Typ

Der Verknüpfungstyp. Hier sind die verschiedenen Verbindungstypen, sortiert vom Besten bis zum Schlechtesten:

  • Die Systemtabelle hat nur eine Zeile (= Systemtabelle). Dies ist ein Sonderfall des const-Jointyps.

  • const: Die Tabelle hat höchstens eine passende Zeile, die beim Starten der Abfrage gelesen wird. Da nur eine Zeile vorhanden ist, können die Spaltenwerte in dieser Zeile vom Rest des Optimierers als Konstanten betrachtet werden. const-Tabellen sind schnell, da sie nur einmal gelesen werden!

  • eq_ref: Lesen Sie für jede Zeilenkombination aus der vorherigen Tabelle eine Zeile aus dieser Tabelle. Dies ist wahrscheinlich der beste Join-Typ, mit Ausnahme von Konstantentypen.

  • ref: Für jede Kombination von Zeilen aus den vorherigen Tabellen werden alle Zeilen mit übereinstimmenden Indexwerten aus dieser Tabelle gelesen.

  • ref_or_null: Dieser Join-Typ ist wie ref, bietet aber zusätzlich die Möglichkeit, dass MySQL gezielt nach Zeilen mit NULL-Werten suchen kann.

  • index_merge: Dieser Verknüpfungstyp gibt an, dass die Indexzusammenführungsoptimierungsmethode verwendet wird.

  • unique_subquery: Dieser Typ ersetzt den Verweis auf die folgende Form der IN-Unterabfrage: value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery ist eine Indexsuchfunktion, die die Unterabfrage vollständig ersetzen kann und effizienter ist.

  • index_subquery: Dieser Verknüpfungstyp ähnelt unique_subquery. Kann IN-Unterabfragen ersetzen, aber nur für nicht eindeutige Indizes in Unterabfragen der folgenden Form: value IN (SELECT key_column FROM single_table WHERE some_expr)

  • Bereich: Rufen Sie nur die Zeilen in einem bestimmten Bereich ab und verwenden Sie einen Index zum Auswählen der Zeilen.

  • Index: Dieser Verknüpfungstyp ist derselbe wie ALL, außer dass nur der Indexbaum gescannt wird. Dies ist normalerweise schneller als ALL, da Indexdateien normalerweise kleiner als Datendateien sind.

  • ALLE: Für jede Zeilenkombination aus der vorherigen Tabelle wird ein vollständiger Tabellenscan durchgeführt, was darauf hinweist, dass die Abfrage optimiert werden muss.

Generell muss darauf geachtet werden, dass die Abfrage mindestens die Bereichsebene, besser noch die Referenzebene erreicht.

mögliche Schlüssel Gibt an, welchen Index MySQL verwenden kann, um Zeilen in dieser Tabelle zu finden
Schlüssel Zeigt die Schlüssel (Indizes), die MySQL tatsächlich zu verwenden beschlossen hat. Wenn kein Index ausgewählt ist, ist der Schlüssel NULL.
Schlüssellänge Zeigt die von MySQL zu verwendende Schlüssellänge an. Wenn der Schlüssel NULL ist, ist die Länge NULL. Je kürzer die Länge, desto besser, ohne an Genauigkeit zu verlieren.
Referenz Zeigt an, welche Spalte oder Konstante zusammen mit dem Schlüssel verwendet wird, um Zeilen aus der Tabelle auszuwählen.
Reihen Zeigt die Anzahl der Zeilen an, die MySQL seiner Meinung nach untersuchen muss, um die Abfrage auszuführen. Durch Multiplizieren der Daten mit mehreren Zeilen lässt sich die Anzahl der zu verarbeitenden Zeilen schätzen.
Filtern nach Zeigt eine Schätzung des Prozentsatzes der durch die Bedingung gefilterten Zeilen.
Extra

Diese Spalte enthält detaillierte Informationen darüber, wie MySQL die Abfrage gelöst hat.

  • Distinct: Nachdem MySQL die erste passende Zeile gefunden hat, wird die Suche nach weiteren Zeilen für die aktuelle Zeilenkombination beendet.

  • Wählen Sie Tabellen aus, die wegoptimiert sind. MySQL gibt Daten zurück, ohne die Tabelle oder den Index überhaupt zu durchlaufen. Dies weist darauf hin, dass die Optimierung bis zu einem Punkt erfolgt ist, an dem keine weitere Optimierung mehr möglich ist.

  • Nicht vorhanden: MySQL kann eine LEFT JOIN-Optimierung für die Abfrage durchführen. Nachdem eine Zeile gefunden wurde, die den LEFT JOIN-Kriterien entspricht, werden in der Tabelle keine weiteren Zeilen mehr auf die vorherige Zeilenkombination geprüft.

  • Für jeden Datensatz wurde der Bereich geprüft (Indexzuordnung: #): MySQL hat keinen geeigneten Index zur Verwendung gefunden, hat jedoch festgestellt, dass möglicherweise ein Teilindex verwendet werden kann, wenn die Spaltenwerte aus der vorherigen Tabelle bekannt sind.

  • Verwenden von Filesort: MySQL benötigt einen zusätzlichen Durchlauf, um herauszufinden, wie die Zeilen in sortierter Reihenfolge abgerufen werden können, was bedeutet, dass die Abfrage optimiert werden muss.

  • Verwenden des Index: Rufen Sie Spalteninformationen aus einer Tabelle ab, indem Sie nur die Informationen im Indexbaum verwenden, ohne weitere Suche durchzuführen, um die tatsächlichen Zeilen zu lesen.

  • Temporäre Tabelle verwenden: Um die Abfrage zu lösen, muss MySQL eine temporäre Tabelle zum Speichern der Ergebnisse erstellen, was bedeutet, dass die Abfrage optimiert werden muss.

  • Verwenden von „where“: Mit der WHERE-Klausel wird eingeschränkt, welche Zeilen der nächsten Tabelle zugeordnet oder an den Client gesendet werden.

  • Verwenden von sort_union(...), Verwenden von union(...), Verwenden von intersect(...): Diese Funktionen veranschaulichen, wie Index-Scans für den Join-Typ index_merge zusammengeführt werden.

  • Index für Group-By verwenden: Ähnlich wie die Methode „Index verwenden“ zum Zugriff auf eine Tabelle bedeutet „Index für Group-By verwenden“, dass MySQL einen Index gefunden hat, mit dem alle Spalten einer GROUP BY- oder DISTINCT-Abfrage abgefragt werden können, ohne dass die Festplatte durchsucht werden muss, um auf die eigentliche Tabelle zuzugreifen.

Zusammenfassen

Oben habe ich Ihnen erklärt, wie Sie mit „explain“ den Ausführungsplan von SQL in MySql abfragen können. Ich hoffe, es wird Ihnen helfen. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und ich werde Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken!

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).
  • So analysieren Sie den SQL-Ausführungsplan in MySQL mit EXPLAIN
  • Detaillierte Erläuterung des Ausführungsplans, Beispiel für einen Befehl in MySQL
  • Einführung in den MySQL-Ausführungsplan
  • MySQL erklärt den Ausführungsplan
  • Erfahren Sie mehr über den MySQL-Ausführungsplan

<<:  So implementieren Sie eine einzelne Dateikomponente in JS

>>:  Detaillierte Erläuterung des Master-Slave-Konfigurationstutorials von Redis unter Docker

Artikel empfehlen

Detaillierte Erläuterung der MySQL-Partitionsfunktion und Beispielanalyse

Zunächst: Was ist Datenbankpartitionierung? Ich h...

Sicherheitsüberlegungen zur Windows-Serververwaltung

Webserver 1. Der Webserver schaltet unnötige IIS-...

Analyse zweier Verwendungen des A-Tags in HTML-Post-Anfragen

Zwei Beispiele für die Verwendung des „a“-Tags in...

Eine kurze Diskussion über die Magie von parseInt() in JavaScript

Ursache Der Grund für das Schreiben dieses Blogs ...

TypeScript-Lernhinweise: Typeingrenzung

Inhaltsverzeichnis Vorwort Typinferenz Einengung ...

So richten Sie eine VSCode-Remoteverbindung zum Server-Docker-Container ein

Inhaltsverzeichnis Ziehen Sie das Bild Ausführen ...

Anwendungsbeispiele für die MySQL-Volltextsuche

Inhaltsverzeichnis 1. Umweltvorbereitung 2. Daten...

Zusammenfassung der MySQL-Fremdschlüsseleinschränkungen und Tabellenbeziehungen

Inhaltsverzeichnis Fremdschlüssel So ermitteln Si...

Spielen Sie mit der Connect-Funktion mit Timeout in Linux

Im vorherigen Artikel haben wir mit Timeouts unte...

So legen Sie die Speichergröße von Docker Tomcat fest

Wenn Sie Tomcat in Docker installieren, kann es b...

So verstehen Sie die Dateninteraktion und -anzeige im Vue-Frontend und -Backend

Inhaltsverzeichnis 1. Technischer Überblick 2. Te...

Codebeispiel für die Verwendung der MySql COALESCE-Funktion

COALESCE ist eine Funktion, die sich nacheinander...

Erfahren Sie, wie Sie ein Vue-Projekt mit Docker bereitstellen

1.Schreiben Sie davor: Als leichtgewichtige Virtu...