Ein Artikel zum Verständnis des Ausführungsprozesses von MySQL-Abfrageanweisungen

Ein Artikel zum Verständnis des Ausführungsprozesses von MySQL-Abfrageanweisungen

Vorwort

Wir müssen bestimmte Daten abrufen, die den Anforderungen aus der Datenbank entsprechen. Es ist einfach für uns, SQL zu schreiben, wie etwa Select ABC FROM T WHERE ID = XX. Was also macht die Datenbank, wenn wir eine solche Anfrage an die Datenbank senden?

Heute nehmen wir MySQL als Beispiel, um den Abfrageprozess der MySQL-Datenbank offenzulegen und allen einige Teile der Datenbank vorzustellen.

MySQL-Architektur

MySQL-Architektur

MySQL kann hauptsächlich in die Serverschicht und die Speicher-Engine-Schicht unterteilt werden.

Die Serverebene umfasst Konnektoren, Abfrage-Caches, Analysatoren, Optimierer, Executoren usw. Alle speicherübergreifenden Engine-Funktionen sind in dieser Ebene implementiert, z. B. gespeicherte Prozeduren, Trigger, Ansichten, Funktionen usw. Es gibt auch ein allgemeines Protokollmodul, das Binlog-Protokollmodul.

Die Speicher-Engine-Schicht ist für das Speichern und Abrufen von Daten verantwortlich. Sein Architekturmodus ist Plug-in-basiert und unterstützt mehrere Speicher-Engines wie InnoDB, MyISAM und Memory. Die derzeit am häufigsten verwendete Speicher-Engine ist InnoDB (das Transaktionen unterstützt), das seit MySQL Version 5.5.5 die Standardspeicher-Engine ist.

Anschlüsse

Der Connector ist hauptsächlich für die Benutzeranmeldung bei der Datenbank und die Authentifizierung der Benutzeridentität verantwortlich, einschließlich der Überprüfung von Kontokennwörtern, Berechtigungen und anderen Vorgängen.

Wenn das Benutzerkennwort falsch ist, erhalten Sie die Fehlermeldung „Zugriff für Benutzer verweigert“ und das Client-Programm wird abgebrochen.

Wenn das Kennwort des Benutzerkontos genehmigt wurde, fragt der Connector alle Berechtigungen des Benutzers in der Berechtigungstabelle ab. Alle nachfolgenden Berechtigungslogikbeurteilungen in diesem Zusammenhang basieren auf den zu diesem Zeitpunkt gelesenen Berechtigungsdaten. Mit anderen Worten: Solange die Verbindung nicht getrennt wird, ist der Benutzer nicht betroffen, selbst wenn der Administrator die Berechtigungen des Benutzers ändert.

Abfragecache

Nachdem der Client eine Verbindung mit dem Server hergestellt hat, fragt MySQL beim Ausführen einer Abfrageanweisung zunächst den Cache ab, um zu überprüfen, ob dieses SQL bereits zuvor ausgeführt wurde. Zuvor ausgeführte Anweisungen und ihre Ergebnisse werden in Form von Schlüssel-Wert-Paaren direkt im Speicher zwischengespeichert. Der Schlüssel ist die Abfrageanweisung und der Wert ist das Abfrageergebnis. Wenn Ihre Abfrage den Schlüssel direkt in diesem Cache finden kann, wird der Wert direkt an den Client zurückgegeben. Wenn kein Treffer vorliegt, müssen nachfolgende Vorgänge ausgeführt werden und die Ergebnisse werden nach Abschluss zwischengespeichert, um den nächsten Aufruf zu ermöglichen.

Werden Ihre Augen leuchten, wenn Sie das sehen? Werden Sie den Drang verspüren, diese großartige Funktion auch zu nutzen?

Tatsächlich ist es nicht empfehlenswert, hier einen Abfragecache zu verwenden. Der Abfragecache läuft sehr häufig ab. Solange eine Tabelle aktualisiert wird, werden alle Abfragecaches dieser Tabelle gelöscht. Daher ist es sehr wahrscheinlich, dass Sie sich große Mühe gegeben haben, die Ergebnisse zu speichern, diese jedoch durch ein Update gelöscht werden, bevor Sie sie verwenden können. Bei Datenbanken mit hohem Aktualisierungsdruck ist die Trefferquote des Abfragecaches sehr niedrig. Sofern es sich nicht um eine Tabelle handelt, die über einen längeren Zeitraum nicht aktualisiert wird, wie z. B. eine Systemkonfigurationstabelle, wäre es für uns nicht besser, diese Art von Systemkonfiguration auf der Konfigurationsplattform abzulegen?

Die Abfrage-Cache-Funktion wurde in MySQL8.0 gelöscht. Der Beamte glaubt auch, dass diese Funktion nur wenige tatsächliche Anwendungsszenarien hat, sodass sie einfach gelöscht wurde.

Analysator

Wenn MySQL den Abfragecache nicht erreicht, wird der Analysator aufgerufen, der hauptsächlich zum Analysieren des Zwecks der SQL-Anweisung verwendet wird. Der Analysator gliedert sich im Wesentlichen in die folgenden zwei Schritte:

  • Lexikalische Analyse: Eine SQL-Anweisung besteht aus mehreren Zeichenfolgen. Zuerst müssen wir Schlüsselwörter extrahieren, wie z. B. „Auswählen“, „Abfragetabelle vorschlagen“, „Feldnamen vorschlagen“, „Abfragebedingungen vorschlagen“ usw.
  • Syntaxanalyse: Basierend auf den Ergebnissen der lexikalischen Analyse bestimmt die Syntaxanalyse hauptsächlich, ob die von Ihnen eingegebene SQL-Anweisung korrekt ist und ob sie der MySQL-Syntax entspricht. Wenn Ihre Anweisung falsch ist, erhalten Sie eine Fehlermeldung „Ihre SQL-Syntax weist einen Fehler auf“.

Der lexikalische Analysator zerlegt die gesamte Abfrageanweisung in verschiedene Token, und der Syntaxanalysator wandelt die „verschiedenen Token“ in Kombinationen um, die basierend auf der definierten Systemsprache für MySQL sinnvoll sind. Schließlich generiert das System einen Syntaxbaum (AST), die Datenstruktur, auf die sich der Optimierer stützt.

Optimierer

Nach dem Analyzer weiß MySQL, was Sie tun werden. Bevor die Ausführung beginnt, muss es zunächst vom Optimierer verarbeitet werden.

Warum brauchen wir einen Optimierer?

  • Der Optimierer enthält viele komplexe Optimierungstechniken, die oft über das Wissen der besten Programmierer hinausgehen. Die automatische Optimierung des Systems ist gleichbedeutend damit, diese Optimierungstechnologien allen zugänglich zu machen.
  • Der Optimierer kann viele statistische Informationen aus dem Datenwörterbuch abrufen, z. B. die Anzahl der Zeilen in der Tabelle, die Verteilung jeder Spalte in der Tabelle usw. Optimierer können Hunderte verschiedener Ausführungspläne in Betracht ziehen, während Programmierer im Allgemeinen nur eine begrenzte Anzahl von Möglichkeiten in Betracht ziehen können.
  • Anhand dieser Informationen lässt sich ein effektiver Ausführungsplan auswählen. Für Benutzerprogramme ist es jedoch schwierig, an diese Informationen zu gelangen.

Kurz gesagt, der Optimierer ändert die Form des Syntaxanalysebaums, konvertiert den Syntaxanalysebaum in einen Abfragebaum und bestimmt den Ausführungsplan.

Stellantrieb

MySQL weiß durch den Analysator, was Sie tun möchten, und weiß durch den Optimierer, wie es zu tun ist. Daher wechselt es in die Executor-Phase und beginnt mit der Ausführung der Anweisung.

Beim Starten der Ausführung muss zunächst überprüft werden, ob der Benutzer die Berechtigung zum Ausführen der Abfrage hat. Wenn nicht, wird eine Fehlermeldung zurückgegeben, die besagt, dass der Benutzer keine Berechtigung hat. Wenn die Berechtigung vorliegt, wird die Schnittstelle der Engine aufgerufen und das Ergebnis der Schnittstellenausführung zurückgegeben.

Anweisungsanalyse

Lassen Sie uns den Ausführungsprozess der MySQL-Abfrage mit der folgenden echten SQL-Abfrageanweisung analysieren:

Wählen Sie ID, Name, Geschlecht und Telefon des Benutzers t aus, wobei t.Alter = „26“ und t.Konto = „javadaily“ ist.

  • Zunächst muss der Client eine Verbindung zur Datenbank herstellen. Wenn Konto und Passwort falsch sind, wird direkt eine Fehlermeldung zurückgegeben. Wenn sie korrekt sind, fahren Sie mit dem nächsten Schritt fort.
  • Vor MYSQL8.0 wird zuerst der Abfragecache durchsucht und diese SQL-Anweisung wird als Schlüssel verwendet, um abzufragen, ob ein Ergebnis im Speicher vorhanden ist. Wenn dies der Fall ist, wird zunächst ermittelt, ob eine Berechtigung vorliegt. Wenn eine Berechtigung vorliegt, wird an den Client zurückgegeben, andernfalls wird ein Fehler gemeldet. Wenn kein Treffer aus dem Abfragecache vorliegt, wird mit dem nächsten Schritt fortgefahren.
  • Der Analysator führt eine lexikalische Analyse durch, um die Schlüsselelemente der SQL-Anweisung zu extrahieren. Die obige Anweisung ist beispielsweise eine Auswahlabfrage, der abzufragende Tabellenname ist „user“, die abzufragenden Spalten sind „id“, „name“, „sex“, „phone“ und die Abfragebedingungen sind „age=26“ und „account=javadailly“. Stellen Sie anschließend fest, ob das SQL-Statement syntaktische Fehler enthält, also etwa die Schlüsselwörter korrekt sind etc. Ist die Prüfung in Ordnung, fahren Sie mit dem nächsten Schritt fort.
  • Das obige SQL hat zwei Ausführungspläne. Der Optimierer wählt Plan A mit der höchsten Ausführungseffizienz basierend auf seinem eigenen Optimierungsalgorithmus aus (ungenaue statistische Informationen können dazu führen, dass der Optimierer den falschen Ausführungsplan auswählt). Nachdem der Optimierungsplan ermittelt wurde, beginnt er mit der Ausführung.

a. Fragen Sie zuerst den Benutzer mit dem Konto „javadaily“ ab und prüfen Sie dann, ob das Alter 26 beträgt. b. Suchen Sie zuerst den Benutzer mit dem Alter „26“ und fragen Sie dann den Benutzer mit dem Konto „javadaily“ ab.

  • Führen Sie eine Berechtigungsprüfung durch. Wenn eine Abfrageberechtigung vorliegt, rufen Sie die Datenbankmodulschnittstelle auf, um das Ausführungsergebnis zurückzugeben. Andernfalls melden Sie einen Fehler.

Zusammenfassen

Dies ist das Ende dieses Artikels zum Verständnis des Ausführungsprozesses von MySQL-Abfrageanweisungen. Weitere relevante Inhalte zum Ausführungsprozess von MySQL-Abfragen finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Ein Beispiel für die Verwendung von PHP zur gleichzeitigen Ausführung mehrerer SQL-Abfrageanweisungen mit mysqli
  • Lernen Sie die Ausführungsreihenfolge von SQL-Abfragen von Grund auf
  • Analysieren Sie, wie eine SQL-Abfrageanweisung in MySQL ausgeführt wird
  • Detaillierte Erläuterung der Schreibreihenfolge und Ausführungsreihenfolge von SQL-Abfrageanweisungen der MySQL-Reihe
  • Wie wird eine SQL-Abfrage in MySQL ausgeführt?
  • Ausführungsprozess der SQL-Abfrageanweisung

<<:  Verwenden Sie vue3, um ein Mensch-Katze-Kommunikations-Applet zu implementieren

>>:  Ist ein Design, das den Designspezifikationen entspricht, ein gutes Design?

Artikel empfehlen

MySQL Series 6-Benutzer und Autorisierung

Inhaltsverzeichnis Tutorial-Reihe 1. Benutzerverw...

Verwendung und Unterschied von Vue.set() und this.$set()

Wenn wir Vue zur Entwicklung verwenden, kann eine...

HTML- und CSS-Grundlagen (unbedingt lesen)

(1) HTML: HyperText Markup Language, die im Wesen...

Werfen wir einen Blick auf die Vorkompilierung von JavaScript (Zusammenfassung)

JS-Lauftrilogie js-Ausführungscode ist in drei Sc...

Optimierung der Datenbank-SQL-Anweisung

Warum optimieren: Beim Start des eigentlichen Pro...

MySQL-Lösung zur Datenpaging-Abfrageoptimierung auf Millionenebene

Wenn die Tabelle Zehntausende Datensätze enthält,...

Detaillierte Erläuterung der MySQL-Sicherung und -Wiederherstellung

Vorwort: In den vorherigen Artikeln wurde die Ver...

JavaScript zum Erreichen eines einfachen Tab-Leisten-Umschaltens

In diesem Artikel wird der spezifische Code für J...

Analyse und Behandlung von Bildlaufleisten in HTML und eingebettetem Flash

Bei der Entwicklung begegnen wir häufig dieser Sit...

Reagieren Sie auf die Verarbeitung von Fehlergrenzkomponenten

Dies ist der Inhalt von React 16. Es ist nicht di...