Die MySQL-Abfrageoptimierung erfordert drei Schritte: Parsen, Vorverarbeitung und Optimierung. Bei jedem dieser Prozesse können Fehler auftreten. In diesem Artikel wird nicht ausführlich auf die Fehlerbehandlung eingegangen, er soll Ihnen jedoch dabei helfen, zu verstehen, wie MySQL Abfragen ausführt, damit Sie bessere Abfragen schreiben können. Parser und PräprozessorenZunächst zerlegt der MySQL-Parser die Abfrage in eine Reihe von Anweisungen und erstellt daraus einen „Analysebaum“. Der Parser verwendet die SQL-Syntax von MySQL, um Abfrageanweisungen zu übersetzen und zu validieren. Der Parser stellt beispielsweise sicher, dass die Anweisungen in der Abfrage gültig und in der richtigen Reihenfolge sind, und prüft, ob Fehler wie nicht übereinstimmende Anführungszeichen in Zeichenfolgen vorliegen. Der Präprozessor überprüft den erstellten Analysebaum auf semantische Informationen, die der Parser nicht verarbeiten kann. Dabei wird beispielsweise die Existenz von Tabellen und Spalten geprüft und Feldnamen und Aliase aufbereitet, um die Eindeutigkeit von Spaltenverweisen sicherzustellen. Als Nächstes überprüft der Präprozessor die Berechtigungen, was normalerweise ziemlich schnell geht (es sei denn, auf Ihrem Server sind eine Reihe von Berechtigungen konfiguriert). Abfrage-OptimiererNach dem Durchlaufen des Parsers und des Präprozessors wird der Parsebaum als gültig eingestuft und kann vom Optimierer verarbeitet und schließlich in einen Abfrageplan umgewandelt werden. Es gibt oft viele Möglichkeiten, eine Abfrage auszuführen, die zum selben Ergebnis führt, und die Aufgabe des Optimierers besteht darin, die beste Option zu finden. MySQL verwendet einen auf Kostenschätzung basierenden Optimierer. Das heißt, es versucht, die Kosten mehrerer Ausführungspläne vorherzusagen und wählt denjenigen mit den niedrigsten Kosten aus. Die ursprünglichen Stückkosten entsprachen dem zufälligen Lesen einer 4-KB-Datenseite. Jetzt ist es jedoch komplexer geworden und umfasst die Kosten für die Durchführung von WHERE-Vergleichsbedingungen. Sie können die Kostenschätzung des Abfrageoptimierers für eine Abfrageanweisung anzeigen, indem Sie die Sitzungsvariable Last_query_cost anzeigen. Wählen Sie SQL_NO_CACHE COUNT(*) aus sakila.film_actor; STATUS ANZEIGEN WIE „Last_query_cost“; Die angezeigten Last_query_cost bedeuten, dass der Optimierer schätzt, dass er die entsprechende Anzahl an zufälligen Datenseitenzugriffen durchführen muss, um die Abfrage abzuschließen. Dies basiert auf den folgenden statistischen Schätzungen:
Der Optimierer berücksichtigt keine Cache-Schätzungen – er geht davon aus, dass das Ergebnis jedes Mal vom Festplatten-E/A gelesen wird. Aus folgenden Gründen wählt der Optimierer möglicherweise nicht immer den besten Ausführungsplan:
Der MySQL-Abfrageoptimierer ist ein sehr komplexes Teil, das viele Optimierungsmethoden verwendet, um eine Abfrageanweisung in einen Abfrageausführungsplan umzuwandeln. Es gibt normalerweise zwei Arten der Optimierung: statische Optimierung und dynamische Optimierung. Die statische Optimierung kann einfach durch die Überprüfung des Analysebaums durchgeführt werden. Beispielsweise kann der Optimierer die WHERE-Bedingung durch mathematische Operationsregeln in eine Gleichung umwandeln. Die statische Optimierung bezieht sich nicht auf konkrete Werte, wie etwa konstante Werte in WHERE-Bedingungen. Sie werden einmal ausgeführt und bleiben gültig, auch wenn die Abfrage mit anderen Werten erneut ausgeführt wird. Es kann als „Optimierung zur Kompilierungszeit“ verstanden werden. Im Gegensatz dazu ist die dynamische Optimierung kontextspezifisch und hängt von einer Vielzahl von Faktoren ab. Beispielsweise der Wert in der WHERE-Bedingung oder die entsprechende Anzahl der Datenzeilen im Index. Dieser Vorgang muss bei jeder Abfrage neu geschätzt werden und kann als „Laufzeitoptimierung“ verstanden werden. Hier sind einige typische Optimierungsmethoden für MySQL:
EXPLAIN SELECT film.film_id, film_actor.actor_id VON sakila.film INNER JOIN sakila.film_actor USING(film_id) WO film.film_id = 1; MySQL teilt diese Abfrage in zwei Schritte auf, sodass das Analyseergebnis zwei Zeilen umfasst. Der erste Schritt besteht darin, die entsprechende Datenzeile in der Filmtabelle zu finden. Da die Abfrage auf dem Primärschlüssel film_id basiert, weiß MySQL, dass nur eine Datenzeile vorhanden ist. Daher ist der Verweis auf das Abfrageanalyseergebnis zu diesem Zeitpunkt eine Konstante. Im zweiten Schritt behandelt MySQL die film_id als bekannten Wert, sodass der Verweis für die Abfrage von film_actor ebenfalls eine Konstante ist. Andere ähnliche Szenarios umfassen, wenn die Einschränkung in der WHERE-, USING- oder ON-Bedingung eine Gleichheit ist. In diesem Beispiel weiß MySQL, dass die film_id in der USING-Bedingung in allen Abfragen derselbe Wert ist und dieser Wert mit der film_id in der WHERE-Bedingung übereinstimmen muss.
ERKLÄREN SIE: SELECT film.film_id FROM sakila.film WHERE film_id=1; Im Feld „Extra“ der Analyseergebnisse wird „Unmögliches WHERE nach dem Lesen von Konstantentabellen festgestellt“ angezeigt. Es gibt noch weitere Situationen, in denen eine vorzeitige Kündigung möglich ist, zum Beispiel: SELECT film.film_id VON sakila.film LINKER ÄUSSERER JOIN sakila.film_actor USING (film_id) WO sakila.film_actor.film_id NULL IST; Diese Abfrage schließt Filme aus, in denen Schauspieler mitspielen. Jeder Film kann mehrere Schauspieler haben, aber sobald ein Schauspieler gefunden wurde, beendet MySQL die Verarbeitung des aktuellen Films und fährt mit dem nächsten fort. Eine ähnliche Situation tritt für DISTINCT und NOT EXISTS auf.
SELECT film.film_id VON sakila.film INNER JOIN sakila.film_actor USING(film_id) WO film.film_id > 500; MySQL erkennt, dass die WHERE-Einschränkung nicht nur für die Filmtabelle, sondern auch für die film_actor-Tabelle gilt. Dieser Optimierungseffekt kann jedoch bei anderen Datenbanken möglicherweise nicht erreicht werden.
Tatsächlich verwendet MySQL noch viel mehr Optimierungsmethoden als die oben aufgeführten und es ist unmöglich, sie hier alle aufzulisten. Denken Sie einfach an die Komplexität des MySQL-Optimierers und wie intelligent er ist. Daher sollte man dem Optimierer erlauben, seine Rolle zu spielen, anstatt die Abfrageanweisung endlos zu optimieren, bis der MySQL-Optimierer keinen Raum mehr für Verbesserungen hat. Obwohl der MySQL-Optimierer sehr intelligent ist, liefert er natürlich nicht unbedingt die besten Ergebnisse. Manchmal kennen Sie das beste Ergebnis, aber MySQL weiß es möglicherweise nicht. In diesem Fall können Sie die Abfrageanweisung optimieren, um MySQL bei der Fertigstellung der Optimierungsarbeit zu unterstützen. Manchmal müssen Sie jedoch Abfragehinweise hinzufügen oder die Abfrage neu schreiben, das Design der Datentabelle ändern oder Indizes hinzufügen. Oben finden Sie Einzelheiten zum Verständnis des MySQL-Abfrageoptimierungsprozesses. Weitere Informationen zur MySQL-Abfrageoptimierung finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Wissen Sie, warum Vue-Daten eine Funktion sind?
>>: Implementierung der kontinuierlichen Integration von Jenkins+Docker
1. Prüfen Sie, ob das Ereignis aktiviert ist Vari...
Weitere spannende Inhalte finden Sie unter https:...
Das auf Tencent Cloud erstellte MySQL ist immer s...
Inhaltsverzeichnis Problembeschreibung: Ursachena...
Vorwort Der SQL-Modus wirkt sich auf die von MySQ...
Mysql ist eine beliebte und einfach zu bedienende...
In diesem Artikel finden Sie das grafische Tutori...
Inhaltsverzeichnis Vorwort Die Rolle des Renders ...
1. Einleitung In diesem Artikel wird beschrieben,...
Es gibt zwei Situationen 1. Startzeit und Endzeit...
WeChat-Applet: Einfacher Rechner. Zu Ihrer Inform...
Nach der Installation von Jenkins schlägt der ers...
1. Erstellen Sie eine Seite mit app.json Gemäß un...
Der Docker-Daemon verwendet HTTP_PROXY , HTTPS_PR...
Verwenden Sie JS, um ein zufälliges Namensaufrufs...