Heim  >  Artikel  >  Datenbank  >  Zusammenfassung der Verwendung von Explain in MySQL (detailliert)

Zusammenfassung der Verwendung von Explain in MySQL (detailliert)

不言
不言nach vorne
2019-01-07 10:37:446245Durchsuche


Dieser Artikel bietet Ihnen eine Zusammenfassung der Verwendung von Explain in MySQL (detailliert), die einen gewissen Referenzwert hat. Als Referenz hoffe ich es wird Ihnen hilfreich sein.

Ausführungsplan (Abfrageausführungsplan)

Syntax

explain select * from table

Explain-Spalten in

expain Es gibt 10 Informationsspalten.
sind id, select_type, Tabelle, Typ, Partitionen, mögliche_Schlüssel, Schlüssel, Schlüssellänge, Ref, Zeilen, Extra. Das Folgende ist eine mögliche Erklärung für das Auftreten dieser Felder:

1. ID

Angabe der Reihenfolge der SQL-Ausführung, SQL wird von groß nach klein ausgeführt

1 Bei gleicher ID erfolgt die Ausführungsreihenfolge von oben nach unten

2. Wenn es sich um eine Unterabfrage handelt, erhöht sich die Sequenznummer der ID. Je größer der ID-Wert, desto höher die Priorität und desto früher wird sie ausgeführt

3. Wenn die IDs Ebenso können sie als Gruppe betrachtet und nacheinander von oben nach unten ausgeführt werden. In allen Gruppen gilt: Je größer der ID-Wert, desto höher die Priorität und desto früher wird sie ausgeführt

2. select_type

gibt den Typ jeder Select-Klausel in der Abfrage an

1. EINFACH: Einfache SELECT-, UNION- oder Unterabfrage ist nicht praktikabel.

2. PRIMÄR: Äußerste SELECT.

3. UNION: Die zweite Ebene verwendet UNION nach SELECT.

4. DEPENDENT UNION: Das zweite SELECT in der UNION-Anweisung hängt von der externen Unterabfrage ab.

5. UNION-ERGEBNIS: Das Ergebnis von UNION.

6. UNTERABFRAGE: Das erste SELECT in der Unterabfrage.

7. ABHÄNGIGE UNTERABFRAGE: Das erste SELECT in der Unterabfrage hängt von der äußeren Abfrage ab.

8. DERIVED: SELECT der abgeleiteten Tabelle (Unterabfrage der FROM-Klausel)

9. MATERIALIZED: UNCACHEABLE SUBQUERY: Ergebnisse können nicht zwischengespeichert werden für jede Zeile der äußeren Abfrage neu berechnet werden

11. UNCACHEABLE UNION: UNION gehört zur zweiten oder nachfolgenden Auswahl einer nicht zwischenspeicherbaren Unterabfrage

3. Tabelle

Der Name der Tabelle, auf die in der Ausgabezeile verwiesen wird. Dies kann auch einer der folgenden Werte sein:

    M,N,...>: Diese Zeile bezieht sich auf die Vereinigung von ID-Wert M und ID-Wert N.

    N>: Diese Zeile bezieht sich auf den Wert N, der für die Ergebnis-ID der abgeleiteten Tabelle der Zeile verwendet wird. Beispielsweise kann eine abgeleitete Tabelle aus einer Unterabfrage in der FROM-Klausel

    N> stammen: Die Zeile bezieht sich auf die ID Das Ergebnis der materialisierten Unterabfrage für die Zeile mit dem Wert N

4. Typ

stellt die Art und Weise dar, wie MySQL die erforderliche Zeile findet die Tabelle, auch bekannt als „Zugriffstyp“.

Häufig verwendete Typen sind: NULL, System, Const, eq_ref, Ref, Range, Index, ALL (von links nach rechts, Leistung vom schlechtesten zum besten)

Die folgende Liste beschreibt vom besten Typ zum besten Der schlechteste Verbindungstyp


NULL

MySQL zerlegt die Anweisung während des Optimierungsprozesses und muss während der Ausführung nicht einmal auf die Tabelle oder den Index zugreifen Der Mindestwert aus einer Indexspalte kann erreicht werden, indem die individuelle Indexsuche abgeschlossen ist.

System

Diese Tabelle hat nur eine Zeile (zum Beispiel: Systemtabelle). Dies ist ein Sonderfall des const-Join-Typs

const

Die Tabelle hat höchstens eine übereinstimmende Zeile, die am Anfang der Abfrage gelesen wird. Da es nur eine Zeile gibt, kann der Rest des Optimierers die Werte der Spalten in dieser Zeile als Konstanten behandeln. const-Tabellen sind sehr schnell, da sie nur einmal gelesen werden.

SELECT * FROM tbl_name WHERE primary_key=1;
SELECT * FROM tbl_name WHERE primary_key_part1=1 AND primary_key_part2=2;

eq_ref

Lesen Sie für jede Zeilenkombination in der vorherigen Tabelle eine Zeile aus dieser Tabelle. Neben System- und Konstantentypen ist dies der beste Verbindungstyp. Es wird verwendet, wenn der Join alle Teile des Index verwendet und der Index ein PRIMARY KEY-Index oder ein UNIQUE NOT NULL-Index ist.

SELECT * FROM ref_table,other_table
  WHERE ref_table.key_column=other_table.column;

SELECT * FROM ref_table,other_table
    WHERE ref_table.key_column_part1=other_table.column
    AND ref_table.key_column_part2=1;

ref

stellt die Verbindungsübereinstimmungsbedingung der obigen Tabelle dar, d. h. welche Spalten oder Konstanten verwendet werden, um den Wert in der Indexspalte zu finden

Volltext

Führen Sie eine Verknüpfung mit dem VOLLTEXT-Index durch.

ref_or_null

SELECT * FROM ref_table WHERE key_column IS NULL;

index_merge

Die Indexzusammenführungszugriffsmethode ruft mehrere Zeilen mit Bereichsscans ab und führt ihre Ergebnisse zu einer zusammen. Diese Zugriffsmethode kombiniert nur Indexscans aus einer einzelnen Tabelle und scannt nicht mehrere Tabellen. Eine Zusammenführung kann eine Vereinigung, Kreuzung oder Kreuzvereinigung der zugrunde liegenden Scans erzeugen

SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;

SELECT * FROM tbl_name
WHERE (key1 = 10 OR key2 = 20) AND non_key = 30;

SELECT * FROM t1, t2
WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%')
AND t2.key1 = t1.some_col;

SELECT * FROM t1, t2
WHERE t1.key1 = 1
AND (t2.key1 = t1.some_col OR t2.key2 = t1.some_col2);

unique_subquery

Dieser Typ ersetzt einige IN-Unterabfragen durch eq_ref der Form:

value IN (SELECT primary_key FROM single_table WHERE some_expr)

index_subquery

Dieser Verbindungstyp ähnelt unique_subquery. Es ersetzt die IN-Unterabfrage, funktioniert aber mit nicht eindeutigen Indizes in einer Unterabfrage der Form:

value IN (SELECT key_column FROM single_table WHERE some_expr)

range

Rufen Sie nur Zeilen innerhalb eines bestimmten Bereichs ab, indem Sie die Indexauswahl OK verwenden . Die Schlüsselspalte in der Ausgabezeile gibt an, welcher Index verwendet werden soll. Enthält key_len, um den Schlüsselteil zu enthalten, der am längsten verwendet wurde. Für diesen Typ ist die Ref-Spalte NULL geeignet. Bereich Wenn eine Schlüsselspalte einen beliebigen Wert im Vergleich zu einer Konstante verwendet, können Sie =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE oder IN()-Operator:

index

Der Index-Join-Typ ist derselbe wie ALL, außer dass der Indexbaum gescannt wird. Es gibt zwei Situationen:

1. Der Indexbaum wird nur gescannt, wenn der Index ein abdeckender Index für die Abfrage ist und verwendet werden kann, um alle in der Tabelle erforderlichen Daten zu erfüllen. In diesem Fall steht in der Spalte „Extra“ „Index verwenden“. Nur-Index-Scans sind in der Regel schneller als ALLE Indizes, die normalerweise kleiner als die Tabellendaten sind.

2. Führen Sie einen vollständigen Tabellenscan mit Lesevorgängen aus dem Index durch, um Datenzeilen in Indexreihenfolge zu finden. Der Verwendungsindex erscheint nicht in der Spalte „Extra“. MySQL kann diesen Verbindungstyp verwenden, wenn die Abfrage nur Spalten verwendet, die zu einem einzelnen Index gehören.

ALLE
Führen Sie einen vollständigen Tabellenscan für jede Zeilenkombination in der vorherigen Tabelle durch. Normalerweise schlecht, wenn die Tabelle die erste ist, die nicht mit const markiert ist, und normalerweise sehr schlecht in allen anderen Fällen. Normalerweise können Sie dies vermeiden, indem Sie einen Index hinzufügen, der das Abrufen von Zeilen aus der Tabelle basierend auf einem konstanten Wert oder einem Spaltenwert aus einer früheren Tabelle ermöglicht. Die Spalte gibt den Index an, den MySQL zum Suchen von Zeilen in dieser Tabelle auswählen kann Welchen Index kann MySQL verwenden, um den Datensatz in der Tabelle zu finden? Wenn für das an der Abfrage beteiligte Feld ein Index vorhanden ist, wird dieser nicht unbedingt von der Abfrage verwendet ist völlig unabhängig von der Reihenfolge der in der EXPLAIN-Ausgabe angezeigten Tabellen. Dies bedeutet, dass einige Schlüssel in „possible_keys“ nicht tatsächlich in der generierten Tabellenreihenfolge verwendet werden können.

Wenn die Spalte NULL ist, gibt es keinen zugehörigen Index. In diesem Fall können Sie die Leistung Ihrer Abfrage verbessern, indem Sie die WHERE-Klausel daraufhin überprüfen, ob sie sich auf bestimmte Spalten oder Spalten bezieht, die für die Indizierung geeignet sind. Wenn ja, erstellen Sie einen entsprechenden Index und überprüfen Sie die Abfrage erneut mit EXPLAIN

6. Schlüssel

In der Schlüsselspalte wird der Schlüssel (Index) angezeigt, für dessen Verwendung sich MySQL tatsächlich entschieden hat


Wenn kein Index ausgewählt ist, ist der Schlüssel NULL. Um MySQL zu zwingen, den Index für die Spalte „posable_keys“ zu verwenden oder zu ignorieren, verwenden Sie FORCE INDEX, USE INDEX oder IGNORE INDEX in der Abfrage.

7. key_len

gibt die Anzahl der im Index verwendeten Bytes an. Die Länge des in der Abfrage verwendeten Index kann über diese Spalte berechnet werden (der angezeigte Wert). von key_len ist das Indexfeld. Die maximal mögliche Länge ist nicht die tatsächlich verwendete Länge, das heißt, key_len wird basierend auf der Tabellendefinition berechnet und nicht aus der Tabelle abgerufen)

Ohne Genauigkeitsverlust, je kürzer die Länge , desto besser

8. ref

gibt die Verbindungsübereinstimmungsbedingungen der obigen Tabelle an, d. h. welche Spalten oder Konstanten verwendet werden, um den Wert im Index zu finden Spalte

9 , Zeilen

gibt an, dass MySQL die Anzahl der Zeilen schätzt, die gelesen werden müssen, um die erforderlichen Datensätze basierend auf Tabellenstatistiken und Indexauswahl zu finden

10. Extra

Die EXPLAIN-Ausgabe der Extra-Spalte enthält zusätzliche Informationen für MySQL, um die Abfrage zu lösen. Die folgende Liste beschreibt die möglichen Werte in dieser Spalte. Jedes Element gibt der JSON-formatierten Ausgabe auch an, welche Eigenschaft den Extra-Wert anzeigt. Für einige von ihnen gibt es eine bestimmte Eigenschaft. Anderer als Nachrichtenattribut angezeigter Text

11. Partitionen (Erweiterung)

Notieren Sie die Partitionen, die der Abfrage entsprechen. Diese Spalte wird nur angezeigt, wenn das Schlüsselwort PARTITIONS verwendet wird. Die nicht partitionierte Tabelle zeigt null an.

Dieser Artikel endet hier. Weitere Informationen zu MySQL finden Sie in der Spalte

MySQL-Tutorial

auf der chinesischen PHP-Website! ! !

Das obige ist der detaillierte Inhalt vonZusammenfassung der Verwendung von Explain in MySQL (detailliert). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen