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: 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. Beispiel einer Explain-AnalyseSiehe 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“; 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 Varianten1) 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). 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 select_type-Spalte mysql> erläutern Sie „select * from film where id = 2;“ 2).primary: die äußerste Auswahl in einer komplexen Abfrage 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; Erklären Sie den oben von select_type abgefragten Graphen. 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“; 3.Tabellenspalten Diese Spalte gibt an, auf welche Tabelle eine EXPLAIN-Zeile zugreift. 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 mysql> erkläre „select min(id) from film“; 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; mysql> Warnungen anzeigen; 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; 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. mysql> erläutern Sie „select * from film where name = 'film1';“ 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; 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;“ 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“; 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. 5. Spalte „possible_keys“ Diese Spalte zeigt, welche Indizes die Abfrage möglicherweise für ihre Suchvorgänge verwendet. 6.Schlüsselspalte In dieser Spalte sehen Sie, welchen Index MySQL tatsächlich verwendet, um den Zugriff auf die Tabelle zu optimieren. 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;“ Die Berechnungsregeln für key_len lauten wie folgt:
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: mysql> erklären Sie „select film_id from film_actor“, wobei film_id = 1; 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';“ Dem Namen der Akteurtabelle wird hier kein Index hinzugefügt. 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"; EXPLAIN SELECT * FROM Mitarbeiter WHERE Name = ‚LiLei‘ AND Alter = 22; EXPLAIN SELECT * FROM Mitarbeiter WHERE Name = ‚LiLei‘ AND Alter = 22 AND Position = ‚Manager‘; 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'; 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. EXPLAIN SELECT * FROM Mitarbeiter WHERE Name = "LiLei"; EXPLAIN SELECT * FROM Mitarbeiter WHERE left(name,3) = 'LiLei'; Das erste SQL verwendet den Index und das zweite SQL führt dazu, dass der Index fehlschlägt. 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‘; 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. EXPLAIN SELECT Name, Alter FROM Mitarbeiter WHERE Name = ‚LiLei‘ AND Alter = 23 AND Position = ‚Manager‘; 6. MySQL kann keine Indizes verwenden, wenn es ungleich (!= oder <>), nicht in, nicht vorhanden ist, was zu einem vollständigen Tabellenscan führt 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? 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 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“; 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: 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:
|
<<: Beispielcode zur Implementierung einer Kreisbahnanimation mit CSS3 und Tabellen-Tags
>>: Docker-Volumes-Dateizuordnungsmethode
Vorbereiten 1. Laden Sie das erforderliche Instal...
1. Kopieren Sie die Konfigurationsdatei in die Be...
Heute werden wir einen fragmentierten Bildladeeff...
In diesem Artikel wird der spezifische Code zur I...
Dieser Artikel erläutert anhand von Beispielen da...
<br />Im ersten Abschnitt dieser Reihe haben...
Daten initialisieren Tabelle löschen, wenn `test_...
Inhaltsverzeichnis Nachlass ES5-Prototypvererbung...
Inhaltsverzeichnis Überblick Front-End-Wissenssys...
Inhaltsverzeichnis Vorwort Einführung in QueryCac...
Karussell-Animationen können das Erscheinungsbild...
Die Installation, Konfiguration und Optimierung v...
Einführung Mit EXISTS wird geprüft, ob eine Unter...
YSlow ist ein von Yahoo USA entwickeltes Plug-in ...
Der Grund für das Schreiben dieses Artikels ist, ...