Beispiele für die Verwendung der MySQL-EXPLAIN-Anweisung

Beispiele für die Verwendung der MySQL-EXPLAIN-Anweisung

Wenn es um die MySQL-Optimierung geht, müssen wir zunächst wissen, wie unsere aktuelle SQL-Anweisung in der eigentlichen Datenbank ausgeführt wird, bevor wir darüber sprechen können, wie sie optimiert werden kann. In MySQL steht uns ein sehr nützliches Schlüsselwort zur Simulation der Anweisungsausführung zur Verfügung: EXPLAIN. Mit EXPLAIN können Sie die Ausführungseffekte von SQL-Anweisungen anzeigen. Dies kann dabei helfen, bessere Indizes auszuwählen, Abfrageanweisungen zu optimieren und besser optimierte Anweisungen zu schreiben. Heute werden wir also über einige grundlegende Verwendungen und Anwendungen dieses Schlüsselworts sprechen.

1. Nutzung

Die Verwendung von EXPLAIN ist sehr einfach:

mysql> EXPLAIN SELECT * FROM Benutzer;

Fügen Sie einfach das Schlüsselwort EXPLAIN vor der ursprünglichen SQL-Anweisung hinzu, oder fügen Sie das Schlüsselwort EXPLAIN gefolgt von der SQL-Anweisung hinzu, die Sie überprüfen möchten.

2. Ausgabeergebnisse

Die Ausgabe der EXPLAIN-Anweisung sind die gewünschten Daten und der Schwerpunkt unserer Analyse.
Schauen wir uns zunächst die Form der entsprechenden Ergebnisse an, die die obige Aussage liefert:

+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+------+------+------+------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+------+------+------+------+
| 1 | SIMPLE | Benutzer | NULL | ALLE | NULL | NULL | NULL | NULL | 3 | 100,00 | NULL |
+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+------+------+------+------+

Die EXPLAIN-Anweisung liefert uns insgesamt 10 Datenspalten. Als Nächstes sehen wir uns die Bedeutung einiger Datenspalten an, die für die Leistungsoptimierung wichtiger sind.

1.Ich würde

Dies ist die Sequenznummer der Auswahlabfrage.

2.Typ auswählen

Wenn unsere SQL-Anweisung keine SELECT-Anweisung ist (d. h. Löschen, Aktualisieren …), ist der Wert dieses Felds der entsprechende Vorgangstyp (Löschen, Aktualisieren …).

mysql> ERKLÄREN SIE INSERT INTO Benutzer VAULES(2,'ahong','31');

Der Ausgabe-Select_Type ist zu diesem Zeitpunkt unser entsprechendes INSERT:

+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+------+------+------+------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+------+------+------+------+
| 1 | INSERT | Benutzer | NULL | ALLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+------+------+------+------+

Wenn die SQL-Anweisung eine Select-Anweisung ist, entspricht sie einigen detaillierten Select-Typen, die wie folgt aussehen können:

SIMPLE: Einfaches SELECT (verwendet keine UNION oder Unterabfragen usw.)
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 RESULT: Das Ergebnis der UNION.
SUBQUERY: Die erste SELECT-Anweisung in einer Unterabfrage
DEPENDENT SUBQUERY: Das erste SELECT in einer Unterabfrage, die von der äußeren Abfrage abhängt. DERIVED: Das SELECT der abgeleiteten Tabelle (eine Unterabfrage in der FROM-Klausel).

Hier ist ein Beispiel für die einfachste mögliche SIMPLE-Abfrage:

mysql> EXPLAIN SELECT * FROM Benutzer;
+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+------+------+------+------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+------+------+------+------+
| 1 | SIMPLE | Benutzer | NULL | ALLE | NULL | NULL | NULL | NULL | 3 | 100,00 | NULL |
+----+----------+----------+---------+------+---------------+---------+---------+------+---------+------+------+------+------+------+

3.Tabelle

Zeigt an, um welche Tabelle es sich bei den Daten handelt, auf die bei dieser Operation zugegriffen wird.

4.Partitionen

Zeigt die von der Tabelle verwendeten Partitionen an. Wenn Sie die Anzahl der Unternehmensbestellungen für zehn Jahre zählen möchten, können Sie die Daten in zehn Partitionen aufteilen, eine für jedes Jahr. Dies kann die Abfrageeffizienz erheblich verbessern.

5.Typ

Dies ist die wichtigste Spalte. Zeigt an, welche Klasse die Verbindung verwendet und ob ein Index verwendet wird oder nicht. Es ist der Schlüssel zur Analyse der Abfrageleistung.
Die Ergebnisse sind wie folgt (vom Besten zum Schlechtesten):

System > const > eq_ref > ref > Volltext > ref_or_null > Index_Merge > eindeutige Unterabfrage > Index_Unterabfrage > Bereich > Index > ALLE

Diese Situationen haben folgende Bedeutung:

  • system, const: Sie können die Abfragevariable in eine Konstante umwandeln. Beispiel: id=1; id ist der Primärschlüssel oder eindeutige Schlüssel.
  • eq_ref: Zugriff auf den Index und Rückgabe der Daten einer einzelnen Zeile. (Erscheint normalerweise beim Verbinden. Der in der Abfrage verwendete Index ist der Primärschlüssel oder eindeutige Schlüssel.)
  • ref: Zugriff auf den Index und Rückgabe der Daten eines bestimmten Wertes. (Es können mehrere Zeilen zurückgegeben werden.) Tritt normalerweise bei Verwendung von = auf.
  • Bereich: Dieser Verknüpfungstyp verwendet einen Index, um einen Zeilenbereich zurückzugeben. Dies ist beispielsweise der Fall, wenn Sie > oder < verwenden, um etwas zu finden, und für das Feld ein Index vorhanden ist (Hinweis: nicht unbedingt besser als ein Index).
  • Index: Scannen Sie die gesamte Tabelle in der Reihenfolge des Index. Der Vorteil besteht darin, dass keine Sortierung erforderlich ist. Der Nachteil besteht jedoch darin, dass die gesamte Tabelle gescannt werden muss.
  • ALLE: Vollständiger Tabellenscan, sollte so weit wie möglich vermieden werden_

Generell muss darauf geachtet werden, dass die Abfrage mindestens die Bereichsebene, besser noch die Referenzebene erreicht, da es sonst zu Performanceproblemen kommen kann.

6.möglicher_Schlüssel

Zeigt die Indexspalten an, die von der Abfrageanweisung verwendet werden können. Der Wert kann eins, ein Vielfaches oder null sein.

7.Schlüssel

Die Schlüsselspalte zeigt die tatsächlich von der Abfrageanweisung verwendete Indexspalte. Wenn null, wird der Index nicht verwendet.
Zeigen Sie die tatsächliche Wirkung von Possible_Key und Key:
Unten sehen Sie eine Datentabelle mit einem Index für die Spalte „Alter“. Wir führen die folgende Abfrage aus:

mysql> erläutern Sie „select * from user where age = 1“;

Es werden folgende Ergebnisse erzielt:

+----+----------+----------+---------+------+---------------+---------+---------+---------+-------+---------+-------+------+------+------+------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+----------+---------+------+---------------+---------+---------+---------+-------+---------+-------+------+------+------+------+
| 1 | SIMPLE | Benutzer | NULL | Ref | Alter | Alter | 5 | const | 1 | 100,00 | NULL |
+----+----------+----------+---------+------+---------------+---------+---------+---------+-------+---------+-------+------+------+------+------+

8.Schlüssellänge

Zeigt die Länge des Indexes an, der von der aktuellen Abfrageanweisung verwendet wird. Je kürzer die Länge, desto besser, ohne an Genauigkeit zu verlieren.

9.ref

Die Spalte der vorherigen Tabelle, auf die verwiesen wird.

10.Reihen

Basierend auf der Tabelle und der Abfrage schätzt MySQL die Anzahl der Zeilen, die es untersuchen muss, um das Endergebnis zurückzugeben. Je größer der Wert dieser Spalte, desto schlechter die Abfrageeffizienz.

11.gefiltert

Ein Prozentwert, der zusammen mit dem Wert der Zeilenspalte verwendet wird, kann den Ergebnissatz der vorherigen Tabelle im Abfrageausführungsplan (QEP) schätzen, um die Anzahl der Iterationen des Verbindungsvorgangs zu bestimmen. Kleine Tabellen steuern große Tabellen und reduzieren so die Anzahl der Verknüpfungen.

12.extra

Es gibt verschiedene Arten von Zusatzinformationen darüber, wie MySQL Abfragen analysiert:

Die in Extra enthaltenen Werte sind:

  • Index verwenden: Verwenden Sie nur den Index, der den Zugriff auf die Tabelle vermeiden kann und eine hohe Leistung aufweist.
  • using where: Verwenden Sie where, um Daten zu filtern. Nicht alle Where-Klauseln müssen using where angezeigt werden. Greifen Sie beispielsweise auf den Index auf die Art = zu.
  • using tmporary: Verwenden Sie eine temporäre Tabelle, um die aktuelle Abfrage zu verarbeiten.
  • using filesort: Verwenden Sie eine zusätzliche Sortierung. Zu diesem Zeitpunkt durchsucht MySQL alle qualifizierten Datensätze entsprechend dem Verknüpfungstyp, speichert den Sortierschlüssel und den Zeilenzeiger und sortiert dann den Schlüssel und ruft die Zeilen der Reihe nach ab. (Wenn „order by v1“ verwendet wird und kein Index verwendet wird, wird eine zusätzliche Sortierung durchgeführt.)
  • Bereich für jeden Datensatz geprüft (Indexzuordnung: N): Es kann kein guter Index verwendet werden.
  • Index zum Gruppieren verwenden: __ bedeutet, dass alle zur Gruppierung benötigten Daten im Index gefunden werden können, ohne die eigentliche Tabelle abzufragen. Erklären Sie „select user_id“ aus der T_Order-Gruppe nach user_id;_

Oben finden Sie den detaillierten Inhalt des Verwendungsbeispiels der MySQL EXPLAIN-Anweisung. Weitere Informationen zur MySQL EXPLAIN-Anweisung finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • MySQL-Abfrageanweisungsprozess und grundlegende Konzepte der EXPLAIN-Anweisung und deren Optimierung
  • MySQL ermöglicht langsame Abfragen (Einführung in die Verwendung der EXPLAIN-SQL-Anweisung)
  • Verwendung von MySQL-Explain (verwenden Sie Explain, um Abfrageanweisungen zu optimieren)
  • Detaillierte Erklärung und praktische Übungen zum Mysql-Tuning-Erklärtool (empfohlen)
  • Eine eingehende Analyse von MySQL erläutert die Verwendung und die Ergebnisse
  • Detaillierte Erklärung des Explain-Typs in MySQL
  • So optimieren Sie die MySQL-Indexfunktion basierend auf dem Schlüsselwort „Explain“
  • Detaillierte Analyse des Explain-Ausführungsplans in MySQL
  • Erläuterung der MySQL-Indexoptimierung
  • MYSQL Performance Analyzer EXPLAIN Anwendungsbeispielanalyse
  • So analysieren Sie den SQL-Ausführungsplan in MySQL mit EXPLAIN

<<:  Drei Schritte zur Lösung des IE-Adressleistensymbol-Anzeigeproblems

>>:  Grundlegendes HTML-Verzeichnisproblem (Unterschied zwischen relativem und absolutem Pfad)

Artikel empfehlen

Implementierungsschritte zum Installieren einer Java-Umgebung in Docker

Dieser Artikel basiert auf Linux CentOS8, um Dock...

Tutorial zur MySQL-SQL-Optimierung: IN- und RANGE-Abfragen

Lassen Sie uns zunächst über die in()-Abfrage spr...

Lösung zur automatischen Beendigung von Docker Run-Containern

Heute ist bei mir ein Problem aufgetreten, als ic...

Docker startet Redis und legt das Passwort fest

Redis verwendet das Apline-Image (Alps) von Redis...

Bild-Scrolling-Effekt mit CSS3 erstellt

Ergebnisse erzielenImplementierungscode html <...

Teilen Sie 20 hervorragende Beispiele für Webformular-Design

Sophie Hardach Kai von Clyde Quay 37 Ost Seifenkis...

Detaillierte Erklärung von count(), group by, order by in MySQL

Ich bin vor Kurzem auf ein Problem gestoßen, als ...

Detailliertes Tutorial zur Installation von MySQL 8.0.12 unter Windows

In diesem Artikel finden Sie eine ausführliche An...

Zusammenfassung häufiger Probleme mit MySQL-Indizes

F1: Welche Indizes hat die Datenbank? Was sind di...

jQuery implementiert alle Auswahl- und umgekehrten Auswahloperationsfälle

In diesem Artikel wird der spezifische Code von j...

Detaillierter Prozess der Vue-Front-End-Verpackung

Inhaltsverzeichnis 1. Verpackungsbefehl hinzufüge...

Schritte zur Bereitstellungsmethode für Docker Stack für Webcluster

Docker wird immer ausgereifter und seine Funktion...