Detaillierte Erklärung, wie eine SQL-Anweisung in MySQL ausgeführt wird

Detaillierte Erklärung, wie eine SQL-Anweisung in MySQL ausgeführt wird

Überblick

Ich habe vor Kurzem begonnen, mir Wissen über MySQL anzueignen. Ich habe es auf der Grundlage der von mir erlernten Kenntnisse und meines eigenen Verständnisses organisiert und weitergegeben. Dieser Artikel analysiert den Ausführungsprozess der nächsten SQL-Anweisung in MySQL, einschließlich des Ablaufs von SQL-Abfragen in MySQL und der Aktualisierung von SQL-Anweisungen.

1. Analyse der MySQL-Architektur

Nachfolgend sehen Sie ein kurzes Architekturdiagramm von MySQL:

MySQL ist hauptsächlich in die Serverebene und die Speicher-Engine-Ebene unterteilt

Serverebene : umfasst hauptsächlich Konnektoren, Abfrage-Cache, Analysator, Optimierer, Executor usw. Alle speicherübergreifenden Engine-Funktionen werden in dieser Ebene implementiert, z. B. gespeicherte Prozeduren, Trigger, Ansichten, Funktionen usw. Es gibt auch ein allgemeines Protokollmodul, das Binglog-Protokollmodul.

Speicher-Engine : Hauptsächlich für das Speichern und Lesen von Daten verantwortlich, verwendet eine austauschbare Plug-In-Architektur und unterstützt mehrere Speicher-Engines wie InnoDB, MyISAM, Memory usw. Unter diesen verfügt die InnoDB-Engine über ein eigenes Protokollmodul, das Redolog-Modul.

Als Standard-Engine wird InnoDB Version 5.5.5 verwendet.

Anschlüsse

Es ist hauptsächlich für die Benutzeranmeldung bei der Datenbank und die Benutzeridentitätsauthentifizierung verantwortlich, einschließlich der Überprüfung des Kontokennworts, der Berechtigungen und anderer Vorgänge. Wenn das Kennwort des Benutzerkontos übergeben wird, fragt der Connector alle Berechtigungen des Benutzers in der Berechtigungstabelle ab. Danach hängt die Berechtigungslogikbeurteilung in dieser Verbindung von den zu diesem Zeitpunkt gelesenen Berechtigungsdaten ab. Mit anderen Worten: Solange die Verbindung nicht getrennt wird, ist der Benutzer nicht betroffen, selbst wenn der Administrator die Berechtigungen des Benutzers ändert.

Abfrage-Cache

Nachdem die Verbindung hergestellt wurde, wird beim Ausführen einer Abfrageanweisung zuerst der Cache abgefragt. Mysql überprüft zunächst, ob das SQL ausgeführt wurde, und speichert es in Form von Schlüssel-Wert im Speicher zwischen. Der Schlüssel ist die Abfrageschätzung und der Wert ist der Ergebnissatz. Wird der Cache-Schlüssel getroffen, wird er direkt an den Client zurückgegeben. Wird er nicht getroffen, werden nachfolgende Operationen ausgeführt und die Ergebnisse nach Abschluss für den nächsten Aufruf zwischengespeichert. Natürlich wird bei der tatsächlichen Ausführung der Cache-Abfrage noch einmal geprüft, ob die Berechtigungen des Benutzers vorliegen und ob Abfragebedingungen für die Tabelle vorliegen.

Es wird nicht empfohlen, Cache für MySQL-Abfragen zu verwenden, da die effektive Zeit des Caches bei häufig aktualisierten Daten zu kurz ist und die Wirkung oft nicht gut ist. Für Daten, die nicht häufig aktualisiert werden, ist es immer noch möglich, Cache zu verwenden. Die Cache-Funktion wurde nach MySQL-Version 8.0 gelöscht. Der Beamte glaubt auch, dass diese Funktion relativ wenige tatsächliche Anwendungsszenarien hat, also wurde sie einfach gelöscht.

Analysator

Wenn MySQL nicht auf den Cache trifft, wird es in den Analysator eingegeben, der hauptsächlich zur Analyse des Zwecks der SQL-Anweisung verwendet wird. Der Analysator ist ebenfalls in mehrere Schritte unterteilt:

Der erste Schritt ist die lexikalische Analyse. Eine SQL-Anweisung besteht aus mehreren Zeichenfolgen. Zuerst müssen wir Schlüsselwörter extrahieren, wie „Auswählen“, „Abfragetabelle vorschlagen“, „Feldnamen vorschlagen“, „Abfragebedingungen vorschlagen“ und so weiter. Nach Abschluss dieser Vorgänge gelangen Sie zum zweiten Schritt.

Der zweite Schritt, die Syntaxanalyse, dient hauptsächlich dazu, festzustellen, ob das von Ihnen eingegebene SQL korrekt ist und ob es der MySQL-Syntax entspricht.

Nach Abschluss dieser beiden Schritte ist MySQL zur Ausführung bereit, aber wie wird es ausgeführt und wie erzielt man das beste Ergebnis? Hier kommt der Optimierer ins Spiel.

Optimierer

Die Rolle des Optimierers besteht darin, den von ihm als optimal erachteten Ausführungsplan auszuführen (obwohl dieser manchmal nicht optimal ist), z. B. wie ein Index ausgewählt wird, wenn mehrere Indizes vorhanden sind, wie die Zuordnungsreihenfolge ausgewählt wird, wenn mehrere Tabellen abgefragt werden usw.

Stellantrieb

Nachdem der Ausführungsplan ausgewählt wurde, ist MySQL bereit, mit der Ausführung zu beginnen. Zunächst wird vor der Ausführung überprüft, ob der Benutzer über die Berechtigung verfügt. Wenn der Benutzer keine Berechtigung hat, wird eine Fehlermeldung zurückgegeben. Wenn der Benutzer über die Berechtigung verfügt, wird die Engine-Schnittstelle aufgerufen und das Ergebnis der Schnittstellenausführung zurückgegeben.

2. Anweisungsanalyse

2.1 Abfrageanweisung

Nachdem nun so viel gesagt wurde: Wie wird eine SQL-Anweisung ausgeführt? Tatsächlich kann unser SQL in zwei Typen unterteilt werden, einer ist Abfrage und der andere ist Aktualisierung (Hinzufügen, Aktualisieren, Löschen). Lassen Sie uns zunächst die Abfrageanweisung analysieren. Die Anweisung lautet wie folgt:

wähle * aus tb_student A, wobei A.Alter='18' und A.Name='Student';

In Kombination mit der obigen Beschreibung analysieren wir den Ausführungsfluss dieser Anweisung:

  1. Prüfen Sie zunächst, ob die Anweisung die Berechtigung hat. Wenn nicht, wird direkt eine Fehlermeldung zurückgegeben. Wenn die Berechtigung erteilt ist, wird vor MySQL 8.0 zuerst der Cache abgefragt, wobei diese SQL-Anweisung als Schlüssel verwendet wird, um abzufragen, ob ein Ergebnis im Speicher vorhanden ist. Wenn ja, wird der Cache direkt zwischengespeichert. Wenn nicht, fahren Sie mit dem nächsten Schritt fort.
  2. Durch den Analysator wird eine lexikalische Analyse durchgeführt, um die Schlüsselelemente der SQL-Anweisung zu extrahieren. Beispielsweise ist die obige Anweisung eine Abfrageauswahl, der abzufragende Tabellenname ist tb_student, alle Spalten müssen abgefragt werden und die Abfragebedingung ist die ID dieser Tabelle = „1“. 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.
  3. Im nächsten Schritt bestimmt der Optimierer den Ausführungsplan. Die obige SQL-Anweisung kann zwei Ausführungspläne haben:

a. Fragen Sie zuerst die Tabelle mit dem Namen des Schülers „Zhang San“ ab und ermitteln Sie dann, ob er 18 Jahre alt ist.
b. Suchen Sie zuerst nach den Schülern, die 18 Jahre alt sind, und suchen Sie dann nach Schülern, deren Name „Zhang San“ ist.

Der Optimierer wählt dann basierend auf seinem eigenen Optimierungsalgorithmus die Lösung mit der besten Ausführungseffizienz aus (der Optimierer glaubt, dass dies möglicherweise nicht immer die beste Lösung ist). Nachdem Sie den Ausführungsplan bestätigt haben, können Sie mit der Ausführung beginnen.

Führen Sie eine Berechtigungsprüfung durch. Wenn keine Berechtigung vorliegt, wird eine Fehlermeldung zurückgegeben. Wenn eine Berechtigung vorliegt, wird die Datenbank-Engine-Schnittstelle aufgerufen und das Ausführungsergebnis der Engine zurückgegeben.

2.2 Update-Anweisung

Oben sehen Sie den Ausführungsprozess einer SQL-Abfrage. Sehen wir uns also an, wie eine Update-Anweisung ausgeführt wird. Die SQL-Anweisung lautet wie folgt:

Aktualisiere tb_student. Setze A.age='19', wobei A.name='19';

Lassen Sie uns Zhang Sans Alter ändern. In der tatsächlichen Datenbank wird dieses Altersfeld definitiv nicht festgelegt, sonst werden Sie vom technischen Direktor geschlagen. Tatsächlich folgt diese Anweisung im Wesentlichen dem Prozess der vorherigen Abfrage, aber es ist notwendig, beim Ausführen von Aktualisierungen Protokolle aufzuzeichnen, wodurch das Protokollmodul eingeführt wird. Das mit MySQL gelieferte Protokollmodul ist binlog (Archivprotokoll), das von allen Speicher-Engines verwendet werden kann. Die häufig verwendete InnoDB-Engine verfügt auch über ein Protokollmodul Redo-Log. Wir werden den Ausführungsprozess dieser Anweisung im InnoDB-Modus besprechen. Der Ablauf ist wie folgt:

  1. Fragen Sie zuerst die Daten von Zhang San ab. Wenn ein Cache vorhanden ist, wird dieser auch verwendet.
  2. Holen Sie sich dann die Abfrageanweisung, ändern Sie das Alter auf 19 und rufen Sie die API-Schnittstelle der Engine auf, um diese Datenzeile zu schreiben. Die InnoDB-Engine speichert die Daten im Speicher und zeichnet gleichzeitig das Redo-Protokoll auf. Zu diesem Zeitpunkt wechselt das Redo-Protokoll in den Vorbereitungszustand und teilt dem Executor mit, dass die Ausführung abgeschlossen ist und jederzeit übermittelt werden kann.
  3. Nach Erhalt der Benachrichtigung zeichnet der Executor das Binärprotokoll auf und ruft dann die Engine-Schnittstelle auf, um das Redo-Protokoll an den festgeschriebenen Status zu übermitteln.
  4. Update abgeschlossen.

Einige Studenten werden hier sicherlich fragen, warum wir zwei Protokollierungsmodule benötigen. Können wir nicht ein Protokollierungsmodul verwenden? Dies ist der vorherige MySQL-Modus. Die MyISAM-Engine verfügt nicht über ein Redo-Log, daher wissen wir, dass sie keine Transaktionen unterstützt. Das bedeutet also nicht, dass nicht nur ein Log-Modul verwendet werden kann, aber die InnoDB-Engine unterstützt Transaktionen über ein Redo-Log. Dann fragen sich manche Studenten vielleicht: Kann ich zwei Protokollmodule verwenden, ohne es so kompliziert zu machen? Warum muss Redo Log den Status „Prepare Pre-Commit“ einführen? Hier verwenden wir einen Beweis durch Widerspruch, um zu erklären, warum wir das tun.

  1. Schreiben Sie zuerst das Redo-Protokoll und committen Sie es direkt, dann schreiben Sie das Binlog. Angenommen, die Maschine stürzt nach dem Schreiben des Redo-Protokolls ab und das Binlog wird nicht geschrieben. Nach dem Neustart der Maschine stellt die Maschine die Daten über das Redo-Protokoll wieder her, aber das Binlog zeichnet die Daten zu diesem Zeitpunkt nicht auf. Wenn die Maschine später gesichert wird, gehen diese Daten verloren, und auch bei der Master-Slave-Synchronisierung gehen diese Daten verloren.
  2. Schreiben Sie zuerst das Binärprotokoll und dann das Redo-Protokoll. Angenommen, die Maschine startet nach dem Schreiben des Binärprotokolls abnormal neu. Da kein Redo-Protokoll vorhanden ist, kann die Maschine diesen Datensatz nicht wiederherstellen. Das Binärprotokoll enthält jedoch einen anderen Datensatz. Dann führt der gleiche Grund wie oben zu Dateninkonsistenzen.

Wenn die zweiphasige Redo-Log-Commit-Methode angewendet wird, ist die Situation anders. Nach dem Schreiben des Binglogs verhindert das Senden des Redo-Logs das Auftreten der oben genannten Probleme und stellt so die Datenkonsistenz sicher. Die Frage ist also: Gibt es eine Extremsituation? Angenommen, das Redo-Protokoll befindet sich im Pre-Commit-Zustand und das Bing-Protokoll wurde geschrieben. Was passiert, wenn zu diesem Zeitpunkt ein abnormaler Neustart erfolgt? Dies hängt vom Verarbeitungsmechanismus von MySQL ab. Der Verarbeitungsprozess von MySQL ist wie folgt:

  1. Stellen Sie fest, ob das Redo-Protokoll vollständig ist. Wenn dies der Fall ist, führen Sie sofort ein Commit durch.
  2. Wenn sich das Redo-Log im Pre-Commit-, aber noch nicht im Commit-Zustand befindet, ermittelt das System, ob das Binärprotokoll vollständig ist. Wenn es vollständig ist, wird das Redo-Log committet, andernfalls wird die Transaktion zurückgesetzt.

Dadurch wird das Problem der Datenkonsistenz gelöst.

Abschluss

  1. Mysql ist hauptsächlich in die Serverschicht und die Engineschicht unterteilt. Die Serverschicht umfasst hauptsächlich Konnektoren, Abfragecache, Analysator, Optimierer, Executor und ein Protokollmodul (Binlog). Dieses Protokollmodul kann von allen Ausführungs-Engines gemeinsam genutzt werden.
  2. Die Engine-Schicht ist Plug-in-basiert und umfasst derzeit hauptsächlich MyISAM, InnoDB, Memory usw.
  3. Der Ausführungsprozess von SQL ist in zwei Kategorien unterteilt. Eine Kategorie ist für Abfragen und andere Prozesse wie folgt: Berechtigungsprüfung ---》Abfrage-Cache ---》Analysator ---》Optimierer ---》Berechtigungsprüfung ---》Ausführer ---》Engine
  4. Der Ausführungsprozess für Update-Anweisungen läuft wie folgt ab: Analyzer ----》Berechtigungsprüfung ----》Executor---》Engine---Redo-Log-Vorbereitung---》Binlog---》Redo-Log-Commit

IV. Referenz

„Gemeinsam ein MySQL-Wissensnetzwerk aufbauen“

Oben finden Sie eine ausführliche Erklärung, wie eine SQL-Anweisung in MySQL ausgeführt wird. Ich hoffe, dass sie Ihnen weiterhilft. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und ich werde Ihnen rechtzeitig antworten. Ich möchte auch allen für ihre Unterstützung der Website 123WORDPRESS.COM danken!

Das könnte Sie auch interessieren:
  • Lösungen für MySQL-Batch-Insert- und eindeutige Indexprobleme
  • Wird der Index durch MySQL ungültig?
  • Detaillierte Erklärung zur Migration einer MySQL-Datenbank auf einen anderen Computer
  • Beispiel für die Verwendung von Go Xorm zum Bedienen von MySQL
  • Klassischer MySQL-High-Level-/Befehlszeilenvorgang (schnell) (empfohlen)
  • Eine kurze Diskussion über die Unterschiede zwischen den drei wichtigsten Datenbanken: Mysql, SqlServer und Oracle
  • Die Verwendung eines eindeutigen MySQL-Schlüssels in Abfragen und damit verbundene Probleme
  • So implementieren Sie eine geplante Sicherung einer MySQL-Datenbank
  • Detaillierte Erläuterung des MySQL-Download- und Installationsprozesses
  • MySQL Slow Query-Optimierung: Die Vorteile von Limit aus Theorie und Praxis

<<:  Gegenfall für die Vue-Implementierung

>>:  So führen Sie den Taskplan crontab alle paar Minuten in einem bestimmten Zeitraum unter Linux automatisch aus

Artikel empfehlen

Informationen zur Verwendung des Iconfont-Vektorsymbols von Alibaba in Vue

Es gibt viele Importmethoden im Internet, und die...

Schritte zur Installation von GRUB auf einem Linux-Server

So installieren Sie GRUB für Linux Server Sie kön...

Tutorial zur Konfiguration der kostenlosen MySQL-Installationsversion

In diesem Artikel wird das kostenlose MySQL-Insta...

Installieren Sie MySQL 5.7.18 mit dem RPM-Paket unter CentOS 7

Ich habe kürzlich MySQL verwendet. Im Artikel „My...

So richten Sie Windows Server 2019 ein (mit Bildern und Text)

1. Installation von Windows Server 2019 Installie...

Detaillierte Erklärung des JavaScript-Stacks und der Kopie

Inhaltsverzeichnis 1. Definition des Stapels 2. J...

W3C Tutorial (9): W3C XPath Aktivitäten

XPath ist eine Sprache zum Auswählen von Teilen v...

Zusammenfassung und Praxis des Javascript-Prototyp-Kettendiagramms

Inhaltsverzeichnis Prototypenkette Wir können ein...

Mysql-String-Abfangen und Abrufen von Daten im angegebenen String

Vorwort: Ich bin auf die Anforderung gestoßen, be...