Detaillierte Erklärung der MySQL EXPLAIN-Ausgabespalten

Detaillierte Erklärung der MySQL EXPLAIN-Ausgabespalten

1. Einleitung

Die EXPLAIN-Anweisung liefert Informationen darüber, wie MySQL eine Anweisung ausführt.

EXPLAIN wird mit den Anweisungen SELECT, DELETE, INSERT, REPLACE und UPDATE verwendet.

mysql> EXPLAIN SELECT * FROM Mitarbeiter WHERE emp_no = 10001;
+----+----------+-----------+---------+-----------+---------------+--------+---------+---------+---------+-------+------+------+------+------+------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+-----------+---------+-----------+---------------+--------+---------+---------+---------+-------+------+------+------+------+------+
| 1 | SIMPLE | Mitarbeiter | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100,00 | NULL |
+----+----------+-----------+---------+-----------+---------------+--------+---------+---------+---------+-------+------+------+------+------+------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

Einfach ausgedrückt kann mit EXPLAIN analysiert werden, ob und welchen Index die SQL-Anweisung verwendet.

EXPLAIN gibt für jede in der SELECT-Anweisung verwendete Tabelle eine Zeile zurück. Es listet die Tabellen in der Ausgabe in der Reihenfolge auf, in der MySQL sie bei der Verarbeitung der Anweisung liest.

MySQL löst alle Verknüpfungen mithilfe von Nested-Loop-Join-Algorithmen auf. Dies bedeutet, dass MySQL eine Zeile aus der ersten Tabelle liest und dann eine passende Zeile in der zweiten Tabelle, der dritten Tabelle usw. findet. Nach der Verarbeitung aller Tabellen durchläuft MySQL nach der Ausgabe der ausgewählten Spalten die Tabellenliste zurück, bis es eine Tabelle findet, in der weitere übereinstimmende Zeilen vorhanden sind. Lesen Sie die nächste Zeile aus dieser Tabelle und fahren Sie mit der nächsten Tabelle fort.

2. EXPLAIN-Ausgabespalten

  • MySQL Version 5.7.33
  • Windows 10 64-Bit

In der obigen Abbildung können wir die Ergebnisse von EXPLAIN sehen, einschließlich der Tabellenkopfzeilen-ID, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows, filtered und Extra. Lassen Sie uns die Bedeutung dieser Felder lernen und sie anhand von Beispielen verstehen.

2.1 Ich würde

SELECT-Kennung, die Sequenznummer des SELECT in der Abfrage. Dieser Wert kann NULL sein, wenn die Zeile auf das Vereinigungsergebnis anderer Zeilen verweist. In diesem Fall zeigt die Tabellenspalte einen Wert wie <unionM,N> an, um anzuzeigen, dass sich die Zeile auf die Vereinigung der Zeilen mit den ID-Werten M und N bezieht.

Es gibt drei Arten von ID-Werten:

Die ID ist dieselbe, die Ausführungsreihenfolge ist von oben nach unten

mysql> ERKLÄREN (
    -> SELECT * FROM Mitarbeiter emp
    -> LEFT JOIN dept_emp de ON emp.emp_no = de.emp_no
    -> LEFT JOIN Abteilungen Abteilung ON dept.dept_no = de.dept_no
    -> WO emp.emp_no = 10001);
+----+----------+----------+---------+--------+---------------+--------+---------+---------+----------------------+----------+----------+----------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+----------+---------+--------+---------------+--------+---------+---------+----------------------+----------+----------+----------+
| 1 | SIMPLE | emp | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100,00 | NULL |
| 1 | SIMPLE | de | NULL | ref | PRIMARY | PRIMARY | 4 | const | 1 | 100,00 | NULL |
| 1 | SIMPLE | Abteilung | NULL | eq_ref | PRIMARY | PRIMARY | 12 | Mitarbeiter.de.Abteilungsnummer | 1 | 100,00 | NULL |
+----+----------+----------+---------+--------+---------------+--------+---------+---------+----------------------+----------+----------+----------+
3 Zeilen im Satz, 1 Warnung (0,03 Sek.)

Die IDs sind unterschiedlich. Wenn es sich um eine Unterabfrage handelt, erhöht sich die ID-Nummer. Je größer der ID-Wert, desto höher die Priorität der Ausführung.

mysql> EXPLAIN SELECT * FROM Mitarbeiter emp
    -> WO emp.emp_no NICHT IN ( SELECT de.emp_no FROM dept_emp de 
    -> WHERE de.dept_no NOT IN ( SELECT dept_no FROM departments WHERE dept_name = 'Entwicklung'));
+----+----------+-------------+------------+-------+-------------------+-----------+---------+---------+-----------+--------+-----------+-------------+-----------+--------------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+-------------+------------+-------+-------------------+-----------+---------+---------+-----------+--------+-----------+-------------+-----------+--------------+
| 1 | PRIMARY | emp | NULL | ALL | NULL | NULL | NULL | NULL | 299468 | 100,00 | Verwenden von „where“ |
| 2 | UNTERABFRAGE | de | NULL | index | PRIMARY | dept_no | 12 | NULL | 308493 | ​​​​100,00 | Verwenden von „where“; Verwenden von „index“ |
| 3 | UNTERABFRAGE | Abteilungen | NULL | const | PRIMARY, Abteilungsname | Abteilungsname | 122 | const | 1 | 100,00 | Index wird verwendet |
+----+----------+-------------+------------+-------+-------------------+-----------+---------+---------+-----------+--------+-----------+-------------+-----------+--------------+
3 Zeilen im Satz, 1 Warnung (0,00 Sek.)

Es gibt sowohl gleiche als auch unterschiedliche IDs

Wenn die ID gleich ist, können sie als Gruppe betrachtet werden. Die Ausführungsreihenfolge derselben Gruppen-ID ist von oben nach unten. Bei verschiedenen Gruppen gilt: Je größer der ID-Wert, desto höher die Ausführungspriorität.

mysql> EXPLAIN SELECT * FROM Mitarbeiter emp
    -> WO emp.emp_no IN (WÄHLEN Sie de.emp_no FROM dept_emp de 
    -> WHERE de.dept_no IN ( SELECT dept_no FROM departments WHERE dept_name LIKE '%Develop%'));
+----+--------------+-------------+------------+-------+-----------------+-----------+--------+----------------+--------+-----------+--------+-----------+----------------------------------------------------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+--------------+-------------+------------+-------+-----------------+-----------+--------+----------------+--------+-----------+--------+-----------+----------------------------------------------------+
| 1 | EINFACH | <Unterabfrage2> | NULL | ALLE | NULL | NULL | NULL | NULL | NULL | 100,00 | NULL |
| 1 | SIMPLE | emp | NULL | ALL | PRIMARY | NULL | NULL | NULL | 299468 | 0,00 | Verwenden von where; Verwenden von Join-Puffer (Block Nested Loop) |
| 2 | MATERIALIZED | Abteilungen | NULL | Index | PRIMARY | Abteilungsname | 122 | NULL | 9 | 11.11 | Verwenden von „where“; Verwenden von „index“ |
| 2 | MATERIALIZED | de | NULL | ref | PRIMARY,dept_no | dept_no | 12 | Mitarbeiter.Abteilungen.dept_no | 38561 | 100,00 | Index wird verwendet |
+----+--------------+-------------+------------+-------+-----------------+-----------+--------+---------------+--------+-----------+-----------------------------------------+
4 Zeilen im Satz, 1 Warnung (0,01 Sek.)

2.2 Typ auswählen

Der Abfragetyp wird hauptsächlich verwendet, um zwischen allgemeinen Abfragen, gemeinsamen Abfragen, Unterabfragen und anderen komplexen Abfragen zu unterscheiden.

Enthält SIMPLE, PRIMARY, UNION, DEPENDENT UNION, UNION RESULT, SUBQUERY, DEPENDENT SUBQUERY, DERIVED, MATERIALIZED, UNCACHEABLE SUBQUERY, UNCACHEABLE UNION

EINFACH

Einfaches SELECT, keine UNION oder Unterabfragen.

mysql> ERKLÄREN Sie, ob * von Mitarbeitern ausgewählt ist, wobei emp_no=10001;
+----+----------+-----------+---------+-----------+---------------+--------+---------+---------+---------+-------+------+------+------+------+------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+----------+-----------+---------+-----------+---------------+--------+---------+---------+---------+-------+------+------+------+------+------+
| 1 | SIMPLE | Mitarbeiter | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100,00 | NULL |
+----+----------+-----------+---------+-----------+---------------+--------+---------+---------+---------+-------+------+------+------+------+------+
1 Zeile im Satz, 1 Warnung (0,00 Sek.)

PRIMÄR

Wenn die Abfrage komplexe Unterteile enthält, wird die äußerste Abfrage als PRIMARY markiert.

mysql> EXPLAIN SELECT * FROM Mitarbeiter emp
    -> WO emp.emp_no IN (WÄHLEN Sie max(emp_no) VON dept_emp);
+----+--------------------+-------+------------+------+---------------+---------+---------+---------+---------+---------+----------+----------+------------------------------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+--------------------+-------+------------+------+---------------+---------+---------+---------+---------+---------+----------+----------+------------------------------+
| 1 | PRIMARY | emp | NULL | ALL | NULL | NULL | NULL | NULL | 299468 | 100,00 | Verwenden von „where“ |
| 2 | ABHÄNGIGE UNTERABFRAGE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Tabellenauswahl wegoptimiert |
+----+--------------------+-------+------------+------+---------------+---------+---------+---------+---------+---------+----------+----------+------------------------------+
2 Zeilen im Satz, 1 Warnung (0,00 Sek.)

UNION

Die zweite oder nachfolgende SELECT-Anweisung, die nach einer UNION erscheinen, werden als UNION gekennzeichnet

mysql> ERKLÄREN (SELECT emp_no,dept_no FROM dept_emp LIMIT 10)
    -> UNION
    -> WÄHLEN Sie emp_no,dept_no AUS dept_manager;
+----+--------------+--------------+------------+-------+---------------+--------+---------+---------+---------+---------+----------+-----------------+
| ID | Auswahltyp | Tabelle | Partitionen | Typ | mögliche Schlüssel | Schlüssel | Schlüssellänge | Ref. | Zeilen | gefiltert | Extra |
+----+--------------+--------------+------------+-------+---------------+--------+---------+---------+---------+---------+----------+-----------------+
| 1 | PRIMARY | dept_emp | NULL | index | NULL | dept_no | 12 | NULL | 308493 | ​​​​100,00 | Index wird verwendet |
| 2 | UNION | dept_manager | NULL | index | NULL | dept_no | 12 | NULL | 24 | 100,00 | Index wird verwendet |
| NULL | UNION-ERGEBNIS | <union1,2> | NULL | ALL | NULL | NULL | NULL | NULL | NULL | NULL | Temporäre | verwenden |
+----+--------------+--------------+------------+-------+---------------+--------+---------+---------+---------+---------+----------+-----------------+
3 Zeilen im Satz, 1 Warnung (0,00 Sek.)

ABHÄNGIGE GEWERKSCHAFT

Wie UNION, erscheint in einer UNION- oder UNION ALL-Anweisung, aber diese Abfrage wird von der äußeren Abfrage beeinflusst.

| UNION RESULT union_result Ergebnis einer UNION.
| UNTERABFRAGE Keine Erstes SELECT in der Unterabfrage
| DEPENDENT SUBQUERY dependent (true) Erstes SELECT in der Unterabfrage, abhängig von der äußeren Abfrage
| DERIVED Keine Abgeleitete Tabelle
| MATERIALIZED materialized_from_subquery Materialisierte Unterabfrage
| UNCACHEABLE SUBQUERY cacheable (false) Eine Unterabfrage, deren Ergebnis nicht zwischengespeichert werden kann und für jede Zeile der äußeren Abfrage neu ausgewertet werden muss
| UNCACHEABLE UNION cacheable (false) Die zweite oder spätere Auswahl in einer UNION, die zu einer nicht zwischenspeicherbaren Unterabfrage gehört (siehe UNCACHEABLE SUBQUERY)

Zusammenfassen

Dies ist das Ende dieses Artikels über MySQL EXPLAIN-Ausgabespalten. Weitere Informationen zu MySQL EXPLAIN-Ausgabespalten finden Sie in den vorherigen Artikeln von 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:
  • Detaillierte Analyse der Erläuterung bei der MySQL-Abfrageoptimierung
  • Detaillierte Erklärung der Verwendung von Explain in MySQL
  • MySQL-Zusammenfassung erklären
  • MySQL-Leistungsanalyse und Erläuterung der Verwendungsanweisungen
  • Detaillierte Erklärung der Rolle von Explain in MySQL
  • Detaillierte Erläuterung der Verwendung von MySQL Explain (Analyseindex)
  • Detaillierte Erklärung des EXPLAIN-Befehls und seiner Verwendung in MySQL
  • Detaillierte Erläuterung des Ausführungsplans, Beispiel für einen Befehl in MySQL
  • MySQL erklärt den Ausführungsplan
  • Detaillierte Erklärung des EXPLAIN-Befehls in MySQL

<<:  Ich habe einige Websites zum Thema Wohndesign herausgesucht, die ich für gut halte.

>>:  Vue-Komponenten Dynamische Komponenten detaillierte Erklärung

Artikel empfehlen

4 Funktionen, die durch das Transform-Attribut in CSS3 implementiert werden

In CSS3 können mit der Transformationsfunktion vi...

Lokale MySQL-Installation und Problemlösung

Vorwort Dieser Artikel ist ziemlich ausführlich u...

Frameset über Iframe in Body einfügen

Da Frameset und Body auf derselben Ebene liegen, k...

Front-End-JavaScript versteht Funktions-Currying gründlich

Inhaltsverzeichnis 1. Was ist Curry 2. Verwendung...

Detaillierte Erläuterung der Winkel-Zweiwegebindung

Inhaltsverzeichnis Bidirektionales Bindungsprinzi...

js implementiert ein einfaches Englisch-Chinesisch-Wörterbuch

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

Zusammenfassung der Konstruktor- und Superwissenspunkte in React-Komponenten

1. Einige Tipps zu mit class in react deklarierte...