Detaillierte Erklärung und praktische Übungen zum Mysql-Tuning-Erklärtool (empfohlen)

Detaillierte Erklärung und praktische Übungen zum Mysql-Tuning-Erklärtool (empfohlen)

MySQL-Tuning: Detaillierte Erläuterung und praktische Übungen zum Explain-Tool. Einführung zum Explain-Tool. Erläuterungsanalysebeispiel. Erläuterung von zwei Varianten. Spaltenindex in Erläuterung. Zusammenfassung der besten praktischen Indexverwendung:
MySQL-Installationsdokumentationsreferenz

Einführung in das Tool erklären

Verwenden Sie das Schlüsselwort EXPLAIN, um den Optimierer zur Ausführung von SQL-Anweisungen zu simulieren und die Leistungsengpässe Ihrer Abfrageanweisungen oder -strukturen zu analysieren. Fügen Sie das Schlüsselwort EXPLAIN vor der Select-Anweisung hinzu, und MySQL setzt eine Markierung auf die Abfrage. Beim Ausführen der Abfrage werden die Ausführungsplaninformationen zurückgegeben, anstatt die SQL-Anweisung auszuführen.
Hinweis: Wenn from eine Unterabfrage enthält, wird die Unterabfrage trotzdem ausgeführt und die Ergebnisse werden in eine temporäre Tabelle geschrieben.

Beispiel einer Explain-Analyse

Siehe die offizielle Dokumentation

Beispieltabelle:
 Tabelle löschen, wenn `Schauspieler` vorhanden ist;
 CREATE TABLE `Schauspieler` (
 `id` int(11) NICHT NULL,
 `name` varchar(45) DEFAULT NULL,
 `update_time` Datum/Uhrzeit DEFAULT NULL,
 PRIMÄRSCHLÜSSEL (`id`)
 )ENGINE=InnoDB STANDARD-CHARSET=utf8;
 
 INSERT INTO `Schauspieler` (`id`, `name`, `update_time`) VALUES (1,'a','2017-12-22
15:27:18'), (2,'b','2017-12-22 15:27:18'), (3,'c','2017-12-22 15:27:18');

Tabelle löschen, wenn „Film“ vorhanden ist;
 CREATE TABLE `Film` (
 `id` int(11) NICHT NULL AUTO_INCREMENT,
 `name` varchar(10) DEFAULT NULL,
 Primärschlüssel (`id`),
 SCHLÜSSEL `idx_name` (`Name`)
 )ENGINE=InnoDB STANDARD-CHARSET=utf8;
 INSERT INTO `Film` (`ID`, `Name`) VALUES (3,'Film0'),(1,'Film1'),(2,'Film2');
Tabelle löschen, wenn `Filmschauspieler` vorhanden ist;
 CREATE TABLE `film_actor` (
 `id` int(11) NICHT NULL,
 `film_id` int(11) NICHT NULL,
 `actor_id` int(11) NICHT NULL,
 `Bemerkung` varchar(255) DEFAULT NULL,
 Primärschlüssel (`id`),
 SCHLÜSSEL `idx_film_actor_id` (`film_id`,`actor_id`)
 )ENGINE=InnoDB STANDARD-CHARSET=utf8;
 INSERT INTO `film_actor` (`id`, `film_id`, `actor_id`) WERTE (1,1,1),(2,1,2),(3,2,1);
mysql> erklären Sie „select * from actor“; 

Bildbeschreibung hier einfügen

Für jede Tabelle der Abfrage wird eine Zeile ausgegeben. Werden zwei Tabellen über einen Join abgefragt, werden zwei Zeilen ausgegeben.

Erklären Sie zwei Varianten

1) Explain erweitert: Bietet zusätzliche Informationen zur Abfrageoptimierung basierend auf Explain. Anschließend können Sie den Befehl „Warnungen anzeigen“ verwenden, um die optimierte Abfrageanweisung abzurufen und zu sehen, was der Optimierer optimiert hat. Es gibt auch eine zusätzliche gefilterte Spalte, die einen Halbverhältniswert darstellt. Zeilen * gefiltert/100 kann die Anzahl der Zeilen schätzen, die in „Explain“ mit der vorherigen Tabelle verknüpft werden (die vorherige Tabelle bezieht sich auf die Tabelle, deren ID-Wert in „Explain“ kleiner ist als der ID-Wert der aktuellen Tabelle).

Bildbeschreibung hier einfügen

2) Partitionen erklären: Im Vergleich zu „erklären“ gibt es ein zusätzliches Partitionsfeld. Wenn die Abfrage auf einer partitionierten Tabelle basiert, werden die Partitionen angezeigt, auf die die Abfrage zugreift.

In neuen Versionen wie MySQL 5.7 und höher müssen Sie „extended“ nicht mehr verwenden, um zusätzliche Informationen abzufragen. Der Befehl „explain extended“ wurde in MySQL 8.0 und höher abgeschafft, und wir müssen nur noch „explain“ verwenden.

Spalten in „Erklären“

Als Nächstes zeigen wir die Informationen zu jeder Spalte in der Erklärung an.

ID-Spalte
Die Nummer der ID-Spalte ist die Seriennummer der Auswahl. Es gibt so viele IDs wie Auswahlen, und die Reihenfolge der IDs nimmt mit der Reihenfolge zu, in der die Auswahlen erscheinen. Je größer die ID-Spalte, desto höher die Ausführungspriorität. Wenn die ID gleich ist, wird sie von oben nach unten ausgeführt. Wenn die ID NULL ist, wird sie zuletzt ausgeführt.
Wenn die Abfrage eine Join-Abfrage enthält, werden mehrere IDs angezeigt. Wenn die Abfrage beispielsweise 1, 2, 3 ergibt, wird zuerst das SQL mit der ID 3 ausgeführt. Wenn die abgefragten IDs 1, 1, 2, 3 lauten und beide IDs 1 sind, wird zuerst das obige SQL ausgeführt.

select_type-Spalte
select_type gibt an, ob es sich bei der entsprechenden Zeile um eine einfache oder komplexe Abfrage handelt.
1).simple: einfache Abfrage. Die Abfrage enthält keine Unterabfragen und Vereinigungen

 mysql> erläutern Sie „select * from film where id = 2;“ 

Bildbeschreibung hier einfügen

2).primary: die äußerste Auswahl in einer komplexen Abfrage
3).subquery: eine Unterabfrage, die in der Auswahl enthalten ist (nicht in der From-Klausel)
4).abgeleitet: Die in der From-Klausel enthaltene Unterabfrage. MySQL speichert die Ergebnisse in einer temporären Tabelle, auch abgeleitete Tabelle genannt.
Verwenden Sie dieses Beispiel, um Primär-, Unterabfrage- und abgeleitete Typen zu verstehen

mysql> set session optimizer_switch='derived_merge=off'; #Deaktivieren Sie die Zusammenführungsoptimierung abgeleiteter Tabellen in MySQL 5.7. 2 erläutern Sie select (select 1 from actor where id = 1) from (select * from film where id = 1) der; 

Bildbeschreibung hier einfügen

Erklären Sie den oben von select_type abgefragten Graphen.
Sprechen wir zunächst über das SQL mit der ID 3. Es wird zuerst ausgeführt, da es eine Unterabfrage nach „from“ ist, sodass der entsprechende select_type abgeleitet wird . Das SQL mit der ID 2 wird danach ausgeführt, da es in der Unterabfrage in „select“ enthalten ist (nicht in der „from“-Klausel), sodass der entsprechende select_type „subquery“ ist .
Das SQL mit der ID 1 wird zuletzt ausgeführt. Es ist die äußerste Auswahl in der komplexen Abfrage, daher ist der entsprechende Auswahltyp primär .
Vergessen Sie abschließend nicht, die zuvor geänderte Konfiguration wiederherzustellen:

mysql> set session optimizer_switch='derived_merge=on'; #Standardkonfiguration wiederherstellen

5).union: Die zweite und nachfolgende Auswahl in einer Union

mysql> erklären Sie „Select 1“, „Union all“, „Select 1“; 

Bildbeschreibung hier einfügen

3.Tabellenspalten

Diese Spalte gibt an, auf welche Tabelle eine EXPLAIN-Zeile zugreift.
Wenn die From-Klausel eine Unterabfrage enthält, weist die Tabellenspalte das Format auf. Dies zeigt an, dass die aktuelle Abfrage von der Abfrage mit der ID=N abhängt und daher die Abfrage mit der ID=N zuerst ausgeführt wird.
Wenn eine Vereinigung vorliegt, ist der Wert der Tabellenspalte UNION RESULT <union1,2>, wobei 1 und 2 die ausgewählten Zeilen-IDs darstellen, die an der Vereinigung teilnehmen.

deriven3 bedeutet, dass zuerst die SQL mit der ID 3 abgefragt wird, was bedeutet, dass die aktuelle Abfrage von der Abfrage mit der ID=3 abhängt.

4. Spalte Typ (wichtiger)

Diese Spalte gibt den Assoziationstyp bzw. Zugriffstyp an, der bestimmt, wie MySQL die Zeilen in der Tabelle sucht, und den ungefähren Bereich der zu suchenden Datenzeilendatensätze. Vom Besten zum Schlechtesten sind dies: system > const > eq_ref > ref > range > index > ALL
Generell muss darauf geachtet werden, dass die Abfrage die Bereichsebene, vorzugsweise die Referenzebene erreicht.
NULL : MySQL kann die Abfrageanweisung während der Optimierungsphase zerlegen, ohne während der Ausführungsphase auf Tabellen oder Indizes zuzugreifen. Um beispielsweise den Minimalwert in einer Indexspalte auszuwählen, können Sie dies tun, indem Sie nur den Index durchsuchen, ohne während der Ausführung auf die Tabelle zugreifen zu müssen.

mysql> erkläre „select min(id) from film“; 

Bildbeschreibung hier einfügen

Lassen Sie es mich hier erklären, da die zugrunde liegende Indexdatenstruktur von MySQL ein B+-Baum ist, der im vorherigen Artikel erläutert wurde. Die Blattknoten am unteren Ende des B+-Baums sind in aufsteigender Reihenfolge von links nach rechts angeordnet. Dies ist das Prinzip des am weitesten links stehenden Präfixes. Um also den kleinsten Wert abzufragen, können Sie ihn direkt vom Index am weitesten links abrufen, ohne suchen zu müssen. Dies ist sehr effizient.

const, system : MySQL kann einen Teil der Abfrage optimieren und in eine Konstante umwandeln (siehe die Ergebnisse der Warnungen anzeigen). Wenn alle für den Primärschlüssel oder eindeutigen Schlüssel verwendeten Spalten mit Konstanten verglichen werden, weist die Tabelle höchstens eine übereinstimmende Zeile auf und wird einmal gelesen, was schneller ist. System ist ein Sonderfall von const. Es ist ein System, wenn in der Tabelle nur ein passendes Tupel vorhanden ist.

mysql> erweitertes select * from (select * from film where id = 1) tmp erklären; 

Bildbeschreibung hier einfügen

mysql> Warnungen anzeigen; 

Bildbeschreibung hier einfügen

eq_ref : Alle Teile des Primärschlüssels oder des eindeutigen Schlüsselindex werden zusammen verwendet und es wird höchstens ein Datensatz zurückgegeben, der die Bedingungen erfüllt. Dies ist wahrscheinlich der beste mögliche Join-Typ außerhalb von const, und einfache Select-Abfragen verfügen nicht über diesen Typ.

erklären Sie, wählen Sie * von Filmschauspieler links aus, schließen Sie sich Film an, auf film_actor.film_id = film.id; 

Bildbeschreibung hier einfügen

Zur Erklärung: Das Feld „film_id“ des obigen „film_actor“ ist ein gemeinsamer Index, sodass die Clusterindexabfrage, die einer anderen Tabelle basierend auf dem sekundären Index entspricht, sehr schnell ist.
ref : Im Vergleich zu eq_ref wird kein eindeutiger Index verwendet, sondern ein normaler Index oder ein Teilpräfix eines eindeutigen Index. Der Index wird mit einem bestimmten Wert verglichen, und es können mehrere qualifizierte Zeilen gefunden werden.
1. Einfache Auswahlabfrage, Name ist ein gemeinsamer Index (nicht eindeutiger Index)

mysql> erläutern Sie „select * from film where name = 'film1';“ 

Bildbeschreibung hier einfügen

2. Fragen Sie die zugehörige Tabelle ab. idx_film_actor_id ist der gemeinsame Index von film_id und actor_id. Hier wird das linke Präfix von film_actor verwendet.

mysql>erklären Sie, wählen Sie film_id aus dem linken Film aus und verbinden Sie film_actor mit film.id = film_actor.film_id; 

Bildbeschreibung hier einfügen

Bereich : Bereichsscans werden normalerweise in Vorgängen wie in(), zwischen,>,<, >= usw. angezeigt. Verwenden eines Indexes zum Abrufen eines bestimmten Zeilenbereichs

mysql> erläutern Sie „select * from actor where id > 1;“ 

Bildbeschreibung hier einfügen

Index : Sie können das Ergebnis erhalten, indem Sie den gesamten Index scannen, normalerweise wird ein sekundärer Index gescannt. Dieser Scan beginnt für eine schnelle Suche nicht beim Stammknoten des Indexbaums, sondern durchläuft und scannt direkt die Blattknoten des sekundären Index. Die Geschwindigkeit ist immer noch relativ langsam. Diese Abfrage verwendet im Allgemeinen einen abdeckenden Index. Der sekundäre Index ist im Allgemeinen klein, daher ist dies normalerweise schneller als ALL.

 mysql> erklären Sie „select * from film“; 

Bildbeschreibung hier einfügen

Erklären Sie, warum der sekundäre Index kleiner ist als der gruppierte Index, weil der sekundäre Index nur die Daten des aktuellen Index speichert, während der gruppierte Index alle Tabellendaten speichert.
ALL : Vollständiger Tabellenscan, der alle Blattknoten Ihres gruppierten Indexes scannt. Normalerweise erfordert dies das Hinzufügen von Indizes zur Optimierung

Bildbeschreibung hier einfügen

5. Spalte „possible_keys“

Diese Spalte zeigt, welche Indizes die Abfrage möglicherweise für ihre Suchvorgänge verwendet.
Bei der Erklärung kann es vorkommen, dass „possible_keys“ eine Spalte hat, der Schlüssel jedoch NULL anzeigt. Dies liegt daran, dass die Tabelle nicht viele Daten enthält und MySQL der Ansicht ist, dass der Index für diese Abfrage nicht sehr hilfreich ist. Daher wird die gesamte Tabelle abgefragt.
Wenn die Spalte NULL ist, gibt es keinen zugehörigen Index. In diesem Fall können Sie die Abfrageleistung verbessern, indem Sie die Where-Klausel untersuchen, um festzustellen, ob Sie einen geeigneten Index erstellen können, und dann „Explain“ verwenden, um die Auswirkung anzuzeigen.

6.Schlüsselspalte

In dieser Spalte sehen Sie, welchen Index MySQL tatsächlich verwendet, um den Zugriff auf die Tabelle zu optimieren.
Wenn kein Index verwendet wird, ist diese Spalte NULL. Wenn Sie MySQL zwingen möchten, den Index der Spalte „possible_keys“ zu verwenden oder zu ignorieren, verwenden Sie in Ihrer Abfrage „Force Index“ oder „Ignore Index“.

7. Spalte key_len

In dieser Spalte wird die Anzahl der von MySQL im Index verwendeten Bytes angezeigt. Anhand dieses Wertes lässt sich berechnen, welche Spalten im Index verwendet werden. Beispielsweise besteht der gemeinsame Index idx_film_actor_id von film_actor aus zwei int-Spalten, film_id und actor_id, und jede int ist 4 Bytes lang. Aus key_len=4 im Ergebnis können wir schließen, dass die Abfrage die erste Spalte verwendet: die Spalte film_id, um eine Indexsuche durchzuführen.

mysql> erklären Sie „select * from film_actor where film_id = 2;“ 

Bildbeschreibung hier einfügen

Die Berechnungsregeln für key_len lauten wie folgt:

  • String, char(n) und varchar(n), in den Versionen 5.0.3 und höher stellt n die Anzahl der Zeichen dar, nicht die Anzahl der Bytes. Wenn es sich um UTF-8 handelt, eine Zahl
  • Oder Buchstaben nehmen 1 Byte ein, und ein chinesisches Zeichen nimmt 3 Byte ein char(n): Wenn das chinesische Zeichen gespeichert ist, beträgt die Länge 3n Byte
  • varchar(n): Beim Speichern chinesischer Zeichen beträgt die Länge 3n + 2 Bytes. Die zusätzlichen 2 Bytes werden zum Speichern der Zeichenfolgenlänge verwendet, da varchar eine Zeichenfolge mit variabler Länge ist.
  • Wertetyp tinyint: 1 Byte
  • smallint: 2 Bytes
  • int: 4 Bytes
  • Bigint: 8 Byte
  • Zeittyp
  • Datum: 3 Bytes
  • Zeitstempel: 4 Bytes
  • Datum/Uhrzeit: 8 Bytes
  • Wenn das Feld NULL zulässt, ist 1 Byte erforderlich, um aufzuzeichnen, ob es NULL ist
  • Die maximale Länge des Index beträgt 768 Bytes. Wenn die Zeichenfolge zu lang ist, führt MySQL einen ähnlichen Prozess wie beim linken Präfixindex aus und extrahiert die erste Hälfte der Zeichen zur Indizierung.

8.Ref-Spalte

In dieser Spalte werden die Spalten oder Konstanten angezeigt, die verwendet werden, um den Wert in der Tabelle im Index des Schlüsselspaltendatensatzes zu finden. Übliche sind: const (Konstante), Feldname (z. B. film.id)

9.Reihen

Diese Spalte enthält die Anzahl der Zeilen, die MySQL voraussichtlich lesen und erkennen wird. Beachten Sie, dass dies nicht die Anzahl der Zeilen im Ergebnissatz ist.

10Zusätzliche Spalten

In dieser Spalte werden zusätzliche Informationen angezeigt. Häufige wichtige Werte sind folgende:
1) Verwenden eines Index : Verwenden eines Überdeckungsindex
Definition des überdeckenden Index : Wenn der Schlüssel im Erläuterungsergebnis des MySQL-Ausführungsplans einen verwendeten Index hat und die nach der Auswahl abgefragten Felder aus dem Baum dieses Index abgerufen werden können, kann diese Situation im Allgemeinen als Verwendung eines überdeckenden Indexes bezeichnet werden, und im Allgemeinen ist ein zusätzlicher Verwendungsindex vorhanden; überdeckende Indizes zielen im Allgemeinen auf Hilfsindizes ab, und das gesamte Abfrageergebnis kann nur über den Hilfsindex abgerufen werden. Der Primärschlüssel kann nicht über den Hilfsindexbaum gefunden werden. Anschließend kann der Primärschlüssel verwendet werden, um andere Feldwerte aus dem Primärschlüsselindexbaum abzurufen.
Um es einfach auszudrücken: Sie müssen nicht zur Tabelle zurückkehren, sondern können über den Sekundärindex, also den gemeinsamen Index, zum gewünschten Ergebnissatz gelangen.

mysql> erklären Sie „select film_id from film_actor“, wobei film_id = 1; 

Bildbeschreibung hier einfügen

2) Verwenden von where: Verwenden Sie eine where -Klausel, um die Ergebnisse zu verarbeiten. Die abgefragten Spalten werden nicht vom Index abgedeckt.

mysql> erläutern Sie „select * from actor where name = 'a';“ 

Bildbeschreibung hier einfügen

Dem Namen der Akteurtabelle wird hier kein Index hinzugefügt.
3) Verwenden der Indexbedingung : Die abgefragten Spalten werden nicht vollständig durch den Index abgedeckt und die Where-Bedingung ist ein Bereich führender Spalten;
4) Temporäre Tabelle verwenden : MySQL muss eine temporäre Tabelle erstellen, um die Abfrage zu verarbeiten. In diesem Fall ist normalerweise eine Optimierung erforderlich und das Erste, was einem in den Sinn kommt, ist die Verwendung von Indizes zur Optimierung.

Tatsächlich gibt es noch viel mehr, daher werde ich sie nicht einzeln vorstellen. Wenn Sie interessiert sind, können Sie die offizielle MySQL-Dokumentation selbst überprüfen.

Bewährte Methoden für die Indizierung

Beispieltabelle:
CREATE TABLE `Mitarbeiter` (
`id` int(11) NICHT NULL AUTO_INCREMENT,
`name` varchar(24) NICHT NULL STANDARD '' KOMMENTAR 'Name',
 `Alter` int(11) NICHT NULL STANDARD '0' KOMMENTAR 'Alter',
 `position` varchar(20) NICHT NULL STANDARD '' KOMMENTAR 'Position',
 `hire_time` Zeitstempel NICHT NULL STANDARD CURRENT_TIMESTAMP KOMMENTAR 'Stellenausschreibungszeitpunkt',
 Primärschlüssel (`id`),
 SCHLÜSSEL `idx_name_age_position` (`Name`,`Alter`,`Position`) MIT BTREE
 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='Mitarbeiterdatentabelle';

 INSERT INTO Mitarbeiter (Name, Alter, Position, Einstellungszeit) VALUES ('LiLei', 22, 'Manager', JETZT ());
 INSERT INTO Mitarbeiter (Name, Alter, Position, Einstellungszeit) VALUES ('HanMeimei', 23, 'Entwickler', JETZT ());
 INSERT INTO Mitarbeiter (Name, Alter, Position, Einstellungszeit) VALUES ('Lucy', 23, 'Entwickler', JETZT ());

Vollständige Werteübereinstimmung

EXPLAIN SELECT * FROM Mitarbeiter WHERE Name = "LiLei"; 

Bildbeschreibung hier einfügen

EXPLAIN SELECT * FROM Mitarbeiter WHERE Name = ‚LiLei‘ AND Alter = 22; 

Bildbeschreibung hier einfügen

EXPLAIN SELECT * FROM Mitarbeiter WHERE Name = ‚LiLei‘ AND Alter = 22 AND Position = ‚Manager‘; 

Bildbeschreibung hier einfügen

2. Regel für das äußerste linke Präfix <br /> Wenn mehrere Spalten indiziert werden, muss die Regel für das äußerste linke Präfix befolgt werden. Dies bedeutet, dass die Abfrage bei der äußersten linken Spalte des Index beginnt und keine Spalten im Index überspringt.

 EXPLAIN SELECT * FROM Mitarbeiter WHERE Name = ‚Bill‘ und Alter = 31;
 EXPLAIN SELECT * FROM Mitarbeiter WHERE Alter = 30 AND Position = 'Entwickler';
 EXPLAIN SELECT * FROM Mitarbeiter WHERE Position = 'Manager'; 

Bildbeschreibung hier einfügen

Oben werden drei Ergebnismengen angezeigt. Nur die erste SQL-Anweisung folgt dem Prinzip des am weitesten links stehenden Präfixes und verwendet den Index für die Abfrage. Die anderen beiden SQL-Anweisungen verletzen das Prinzip des am weitesten links stehenden Präfixes, d. h. die Abfrage beginnt nicht beim Namensfeld, sodass der Index nicht verwendet wird, was zu einem Indexfehler führt.
3. Führen Sie keine Vorgänge (Berechnungen, Funktionen, (automatische oder manuelle) Typkonvertierung) an der Indexspalte aus, da dies zum Ausfall des Index und zum Wechsel zu einem vollständigen Tabellenscan führen würde

 EXPLAIN SELECT * FROM Mitarbeiter WHERE Name = "LiLei";
EXPLAIN SELECT * FROM Mitarbeiter WHERE left(name,3) = 'LiLei'; 

Bildbeschreibung hier einfügen

Das erste SQL verwendet den Index und das zweite SQL führt dazu, dass der Index fehlschlägt.
4. Die Speicher-Engine kann die Spalten auf der rechten Seite der Bereichsbedingung im Index nicht verwenden

EXPLAIN SELECT * FROM Mitarbeiter WHERE Name = ‚LiLei‘ AND Alter = 22 AND Position = ‚Manager‘;
2 EXPLAIN SELECT * FROM Mitarbeiter WHERE Name = ‚LiLei‘ AND Alter > 22 AND Position = ‚Manager‘; 

Bildbeschreibung hier einfügen

varchar(n): Beim Speichern chinesischer Zeichen beträgt die Länge 3n + 2 Bytes. Die zusätzlichen 2 Bytes werden zum Speichern der Zeichenfolgenlänge verwendet, da varchar eine Zeichenfolge mit variabler Länge ist.
Das Namensfeld umfasst 3*24+2=74 Bytes
Das Altersfeld ist vom Typ Int und belegt 4 Bytes.
74+4=78
Dies führt dazu, dass der nachfolgende Positionsindex fehlschlägt
5. Versuchen Sie, abdeckende Indizes zu verwenden (Abfragen, die nur auf den Index zugreifen (Indexspalten umfassen Abfragespalten)), um select * -Anweisungen zu reduzieren

EXPLAIN SELECT Name, Alter FROM Mitarbeiter WHERE Name = ‚LiLei‘ AND Alter = 23 AND Position = ‚Manager‘; 

Bildbeschreibung hier einfügen

6. MySQL kann keine Indizes verwenden, wenn es ungleich (!= oder <>), nicht in, nicht vorhanden ist, was zu einem vollständigen Tabellenscan führt
< kleiner als, > größer als, <=, >= usw. Der interne MySQL-Optimierer beurteilt, ob der Index verwendet werden soll, und zwar basierend auf mehreren Faktoren wie der Abrufrate und der Tabellengröße.

ist null, ist nicht null Im Allgemeinen kann der Index nicht verwendet werden

EXPLAIN SELECT * FROM Mitarbeiter WHERE Name ist null

Like beginnt mit einem Platzhalterzeichen ('$abc...') und der MySQL-Index wird ungültig, was zu einem vollständigen Tabellenscanvorgang führt. Frage: Wie kann das Problem gelöst werden, dass der Index '% string %' nicht verwendet wird?
a) Bei Verwendung eines überdeckenden Index muss das Abfragefeld das Feld sein, für das der überdeckende Index erstellt wird

EXPLAIN SELECT Name, Alter, Position FROM Mitarbeiter WHERE Name wie '%Lei%';

b) Wenn keine abdeckenden Indizes verwendet werden können, müssen Sie möglicherweise Suchmaschinen verwenden
9. Die String-Indizierung schlägt ohne einfache Anführungszeichen fehl

EXPLAIN SELECT * FROM Mitarbeiter WHERE Name = '1000';
EXPLAIN SELECT * FROM Mitarbeiter WHERE Name = 1000;

Verwenden Sie oder oder sparsam. Wenn Sie sie für Abfragen verwenden, verwendet MySQL den Index möglicherweise nicht. Der interne Optimierer von MySQL bewertet anhand mehrerer Faktoren wie der Abrufrate und der Tabellengröße, ob der Index verwendet werden soll. Weitere Informationen finden Sie unter Bereichsabfrageoptimierung Bereichsabfrageoptimierung Hinzufügen eines Einzelwertindex zu Age

 ALTER TABLE `Mitarbeiter` ADD INDEX `idx_age` (`Alter`) USING BTREE; 
Erläutern Sie „Select * from employees where age >=1 and age <=2000“; 

Bildbeschreibung hier einfügen

Grund für die Nichtverwendung des Index: Der interne Optimierer von MySQL beurteilt anhand mehrerer Faktoren wie Abrufverhältnis und Tabellengröße, ob der Index verwendet werden soll. In diesem Beispiel kann sich der Optimierer beispielsweise dazu entschließen, die Indexoptimierungsmethode nicht zu verwenden, weil die einzelne Datenabfrage zu groß ist: Der große Bereich kann in mehrere kleine Bereiche aufgeteilt werden.

 Erläutern Sie „Select * from employees where age >=1 and age <=1000“;
 Erläutern Sie die Auswahl * aus Mitarbeitern, bei denen Alter >=1001 und Alter <=2000 ist.

Wiederherstellen des ursprünglichen Indexstatus

ALTER TABLE `Mitarbeiter` DROP INDEX `idx_age`;

Zusammenfassung der Indexverwendung:

Bildbeschreibung hier einfügen

Dies ist das Ende dieses Artikels über die detaillierten Erklärungen und praktischen Übungen des MySQL-Tuning-Erläuterungstools. Weitere relevante Inhalte zum MySQL-Tuning-Erläuterungstool finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den verwandten Artikeln weiter unten. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • 15 wichtige Variablen, die Sie zur MySQL-Leistungsoptimierung kennen müssen (Zusammenfassung)
  • Detaillierte Analyse des I/O-Overheads zur Leistungsoptimierung von SQL Server
  • Einführung in gängige MySQL-Speicher-Engines sowie Parametereinstellung und -optimierung
  • SQL Server-Leistungsoptimierung: So reduzieren Sie die Abfragezeit von 20 Sekunden auf 2 Sekunden
  • SQL Server-Leistungsoptimierungscache
  • Praktische Weitergabe von SQL-Tuning für Systeme mit mehreren zehn Millionen Benutzern

<<:  Beispielcode zur Implementierung einer Kreisbahnanimation mit CSS3 und Tabellen-Tags

>>:  Docker-Volumes-Dateizuordnungsmethode

Artikel empfehlen

So installieren Sie PHP7.4 und Nginx auf Centos

Vorbereiten 1. Laden Sie das erforderliche Instal...

Konfigurieren Sie VIM als C++-Entwicklungseditor in Ubuntu

1. Kopieren Sie die Konfigurationsdatei in die Be...

Implementierung einer Bildfragmentierungsladefunktion basierend auf HTML-Code

Heute werden wir einen fragmentierten Bildladeeff...

Vue.js verwendet Element-ui, um das Navigationsmenü zu implementieren

In diesem Artikel wird der spezifische Code zur I...

Detaillierte Erläuterung der MySQL-Cursor-Konzepte und -Verwendung

Dieser Artikel erläutert anhand von Beispielen da...

Verbesserungen am Webserver zur Verbesserung der Website-Leistung

<br />Im ersten Abschnitt dieser Reihe haben...

So konvertieren Sie MySQL horizontal in vertikal und vertikal in horizontal

Daten initialisieren Tabelle löschen, wenn `test_...

Unterschiede zwischen ES6-Vererbung und ES5-Vererbung in js

Inhaltsverzeichnis Nachlass ES5-Prototypvererbung...

Tipps zum MySQL-Abfragecache

Inhaltsverzeichnis Vorwort Einführung in QueryCac...

JS implementiert Karussell mit mehreren Tabs

Karussell-Animationen können das Erscheinungsbild...

Tutorial zur Optimierung der Installationskonfiguration von MySQL 8.0.18

Die Installation, Konfiguration und Optimierung v...

Zusammenfassung der Mysql-Existes-Verwendung

Einführung Mit EXISTS wird geprüft, ob eine Unter...

MySQL-Schnellwiederherstellungslösung basierend auf dem Zeitpunkt

Der Grund für das Schreiben dieses Artikels ist, ...