Detaillierte Erläuterung des Ausführungsprozesses von MySQL-Abfrageanweisungen

Detaillierte Erläuterung des Ausführungsprozesses von MySQL-Abfrageanweisungen

Lassen Sie uns zunächst kurz überprüfen, was MySQL hinter einer Abfrageanweisung macht:

  • Der Client sendet eine Anfrage an den Server.
  • Dabei prüft der Server zunächst den Abfrage-Cache und gibt bei einem Cache-Treffer sofort das im Cache gespeicherte Ergebnis zurück. Andernfalls fahren Sie mit der nächsten Phase fort.
  • Der Server analysiert und verarbeitet das SQL vor, und dann generiert der Optimierer den entsprechenden Ausführungsplan.
  • MySQL ruft die API der Speicher-Engine auf, um die Abfrage basierend auf dem vom Optimierer generierten Ausführungsplan auszuführen.
  • Geben Sie das Ergebnis an den Client zurück.

Als Nächstes werden wir auf die einzelnen Schritte dieses Prozesses näher eingehen.

1. Kommunikationsmethode zwischen Client und Server

Die Kommunikation zwischen Client und Server ist eine Halbduplex-Kommunikation, d. h., immer nur eine Partei kann gleichzeitig Daten an die andere Partei senden. Daher kann der Client nach dem Senden der Abfrageanforderung nur darauf warten, dass der Server die Abfrageergebnisse zurückgibt. Er muss warten, bis alle zurückgegebenen Daten empfangen wurden, bevor er mit dem nächsten Schritt fortfahren kann. Er kann das Senden nicht unterbrechen oder die Verbindung während des Server-Sendevorgangs trennen.

2. Abfrage-Cache

Wenn der Abfragecache aktiviert ist, prüft MySQL vor dem Parsen einer Abfrageanweisung zunächst, ob die Abfrage auf die Daten im Abfragecache trifft. Diese Prüfung erfolgt mithilfe einer Groß-/Kleinschreibung beachtenden Hash-Tabelle. Wenn die Abfrage den Cache erreicht, wird das Ergebnis direkt aus dem Cache abgerufen und an den Client zurückgegeben. MySQL führt die folgenden Vorgänge nicht mehr aus, d. h. die Abfrageanweisung wird nicht analysiert, es wird kein Ausführungsplan generiert und sie wird nicht ausgeführt.

3. Abfrageoptimierungsverarbeitung

Diese Verknüpfung ist möglicherweise die komplizierteste Verknüpfung im gesamten Abfrageausführungsprozess, der in drei Schritte unterteilt werden kann: SQL-Analyse, Vorverarbeitung und Optimierung des SQL-Ausführungsplans.

(1) Syntaxparser und Vorverarbeitung Dieser Prozess dient dazu, die Syntax der von uns übergebenen SQL-Anweisung zu überprüfen und die Abfrageberechtigungen zu verifizieren. Binghui generiert einen „Analysebaum“.

(2) Wenn der Abfrage-Optimierer diesen Schritt erreicht, beweist er, dass es keine Probleme mit der Syntax unserer Anweisung gibt. Eine Abfrage kann mehrere Ausführungspläne haben, die korrekte Ergebnisse zurückgeben können. Dieser Schritt dient der Auswahl des optimalen Ausführungsplans.
Der optimale Ausführungsplan von MySQL basiert auf den Kosten. MySQL legt für jede Operation die Kosten fest (z. B. das Durchführen eines Where-Vergleichs) und wählt aus allen Ausführungsplänen den Vorgang mit den niedrigsten „Kosten“ aus.
Mit der folgenden Anweisung können wir die Kosten der vorherigen Abfrageoperation anzeigen:

mysql> STATUS ANZEIGEN WIE 'last_query_cost';

MySQL gibt Daten zu den Ausführungskosten zurück:

+-----------------+----------+
| Variablenname | Wert |
+-----------------+----------+
| Kosten der letzten Abfrage | 0,549000 |
+-----------------+----------+

Es ist jedoch anzumerken, dass die minimalen „Kosten“ hier nicht die schnellste Abfragegeschwindigkeit bedeuten. Das heißt, die Beurteilung der Qualität einer Abfrageanweisung anhand der „Kosten“ ist manchmal unzuverlässig.

Die Optimierungsstrategien des Optimierers können grob in zwei Typen unterteilt werden: statische Optimierung und dynamische Optimierung.

Bei der statischen Optimierung wird der zuvor erstellte Parsebaum direkt analysiert. So kann beispielsweise die Where-Bedingung durch einige algebraische Transformationen in eine andere äquivalente Form umgewandelt werden. Die statische Optimierung bleibt nach der ersten Ausführung wirksam und ändert sich nicht, selbst wenn die Abfrage wiederholt mit unterschiedlichen Parametern ausgeführt wird. Sie kann als eine Art „Optimierung der Kompilierungszeit (Vorverarbeitungszeit)“ betrachtet werden.

Die dynamische Optimierung bezieht sich auf den Abfragekontext und muss bei jeder Abfrage neu ausgewertet werden. Sie kann als eine Art „Laufzeitoptimierung“ betrachtet werden.

Im Folgenden sind einige der Optimierungstypen aufgeführt, die MySQL verarbeiten kann:

  • Neudefinieren der Reihenfolge verknüpfter Tabellen

Manchmal ist die Reihenfolge der verknüpften Tabellen in der von uns angegebenen Abfrageanweisung für die Abfrageeffizienz möglicherweise nicht optimal. In diesem Fall kann MySQL uns automatisch dabei helfen, die Reihenfolge der verknüpften Tabellen anzupassen, um die Effizienz zu verbessern.

  • Äußeren Join in inneren Join umwandeln

Nicht alle OUT JOIN-Anweisungen müssen als äußere Verknüpfungen ausgeführt werden. MySQL kann dies erkennen und die Abfrage so umschreiben, dass die Reihenfolge der Verknüpfungen angepasst wird.

  • Verwenden gleichwertiger Transformationsregeln

Verwenden Sie einige gleichwertige Anweisungen, um die Anzahl der Vergleiche zu reduzieren und einige Bedingungen zu entfernen, die immer oder nicht immer wahr sind. Beispielsweise wird (5=5 UND a>5) als a>5 umgeschrieben; wenn (a5 UND b=c UND a=5).

  • Optimieren von COUNT(), MIN() und MAX()

Indizes und die Nullbarkeit von Spalten können bei der Optimierung dieses Ausdruckstyps helfen. Wenn Sie beispielsweise nach dem Minimalwert suchen, können Sie den Index verwenden, um direkt den Datensatz ganz links zu finden. Auf diese Weise müssen Sie nicht die gesamte Tabelle abfragen, sondern können sie durch eine Konstante ersetzen.

  • Abdeckungsindex-Scan

Wenn die Spalten im Index alle in der Abfrage benötigten Spalten enthalten, verwendet MySQL den Index, um die erforderlichen Daten zurückzugeben, ohne die entsprechenden Datenzeilen abzufragen.

  • Vorzeitiges Beenden einer Abfrage

MySQL kann die Abfrage immer sofort beenden, wenn es feststellt, dass die Abfrage die Anforderungen erfüllen kann. Ein typisches Beispiel ist die Verwendung der LIMIT-Klausel.

An diesem Punkt hat die MySQL-Serverebene einen optimalen Ausführungsplan basierend auf der gegebenen Abfrageanweisung erstellt. Wir müssen jedoch wissen, dass die Reihe von Vorgängen, die wir bisher durchgeführt haben, alle auf der Serverebene ausgeführt werden und dass die Daten nicht auf dieser Ebene gespeichert werden. Daher müssen wir unseren optimalen Ausführungsplan zur Suche in die tatsächliche Speicher-Engine übertragen. Dies führt uns zu unserem nächsten Schritt: dem Abrufen der entsprechenden statistischen Informationen von der Speicher-Engine.

4. Abfrageausführungs-Engine

Im Vergleich zur Abfrageoptimierungsphase ist die Abfrageausführungsphase nicht so kompliziert. MySQL führt die im Ausführungsplan angegebenen Anweisungen einfach Schritt für Schritt aus.

5. Ergebnisse an den Kunden zurückgeben

Der letzte Schritt der Abfrageausführung besteht darin, die Ergebnisse an den Client zurückzugeben. Auch wenn die Abfrage keinen Ergebnissatz an den Client zurückgeben muss, gibt MySQL dennoch einige Informationen zur Abfrage zurück, z. B. die Anzahl der von der Abfrage betroffenen Zeilen.
Wenn die Abfrage zwischengespeichert werden kann, legt MySQL die Abfrageergebnisse zu diesem Zeitpunkt im Abfragecache ab.
Die Ergebnisrückgabe erfolgt schrittweise und stufenweise. Das heißt, sobald das erste Ergebnis vorliegt, wird mit der Rückgabe an den Client begonnen. Dies hat den Vorteil, dass nicht alle Daten auf einmal zurückgegeben werden, was zu übermäßigem Speicherverbrauch führt, und dass der Client die Ergebnisse so schnell wie möglich erhalten kann. Jede Zeile im Ergebnissatz wird in einem Paket gesendet, das dem MySQL-Client/Server-Kommunikationsprotokoll entspricht, und dann über das TCP-Protokoll übertragen. Während des TCP-Übertragungsprozesses können die Pakete zwischengespeichert und dann in Stapeln übertragen werden.

Oben finden Sie eine ausführliche Erläuterung des Ausführungsprozesses von MySQL-Abfrageanweisungen. Weitere Informationen zu MySQL-Abfrageanweisungen finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • MySQL führt eine Anweisung im Detail aus
  • Ein Artikel zum Verständnis des Ausführungsprozesses von MySQL-Abfrageanweisungen
  • Django führt native MySQL-Anweisungen aus, um eine Prozessanalyse zu implementieren
  • So implementieren Sie dynamische SQL-Anweisungen in gespeicherten MySQL-Prozeduren
  • Der Ausführungsprozess einer SQL-Anweisung

<<:  Scrollen von HTML-Marquee-Zeichenfragmenten

>>:  Lösung für den Docker-Container, der keine Schreibberechtigung für das Host-Verzeichnis hat

Artikel empfehlen

CSS3 implementiert den Beispielcode der NES-Spielekonsole

Ergebnisse erzielenImplementierungscode html <...

CSS3 verwendet Animationsattribute, um coole Effekte zu erzielen (empfohlen)

animation-name Animationsname, kann mehrere Werte...

So erstellen Sie eine PHP+Nginx+Swoole+MySQL+Redis-Umgebung mit Docker

Betriebssystem: Alibaba Cloud ESC-Instanz centos7...

Javascript Blob-Objekt zum Erzielen eines Dateidownloads

Inhaltsverzeichnis veranschaulichen 1. Blob-Objek...

So installieren und konfigurieren Sie den Postfix-Mailserver unter CentOS 8

Postfix ist ein kostenloser und quelloffener MTA ...

So fragen Sie Datum und Uhrzeit in MySQL ab

Vorwort: Bei der Projektentwicklung werden in ein...

WeChat-Applet-Canvas implementiert Signaturfunktion

Im WeChat-Applet-Projekt umfasst das Entwicklungs...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.7.27 winx64

In diesem Artikel wird die Installations- und Kon...

5 Möglichkeiten zum Senden von E-Mails in der Linux-Befehlszeile (empfohlen)

Wenn Sie eine E-Mail in einem Shell-Skript erstel...

Einführung in RHCE-Bridging, passwortfreie Anmeldung und Portnummernänderung

Inhaltsverzeichnis 1. Konfigurieren Sie Bridging ...

Der Unterschied zwischen HTML, XHTML und XML

Entwicklungstrends: html (Hypertext-Markup-Sprache...