Inhaltsverzeichnis- 1. Analyse der MySQL-Architektur
- 1.1 Anschlüsse
- 1.2 Abfrage-Cache
- 1.3 Analysator
- 1.4 Optimierer
- 1.5 Stellantrieb
- 2. Anweisungsanalyse
- 2.1 Abfrageanweisung
- 2.2 Update-Anweisung
- Abschluss
1. Analyse der MySQL-Architektur Nachfolgend sehen Sie ein kurzes Architekturdiagramm von MySQL: 
mysql ist hauptsächlich in Server 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, binglog -Protokollmodul. Speicher-Engine: hauptsächlich verantwortlich für das Speichern und Lesen von Daten, verwendet eine austauschbare Plug-In-Architektur, unterstützt mehrere Speicher-Engines wie InnoDB , MyISAM , Memory usw., von denen die InnoDB-Engine über ein eigenes Protokollmodul redolog Modul verfügt. Als Standard-Engine wird InnoDB Version 5.5.5 verwendet. 1.1 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. 1.2 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 Key-Value im Speicher zwischen. Der Schlüssel ist die Abfrageschätzung und Value 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. 1.3 Analysator Wenn mysql den Cache nicht erreicht, wird der Analysator aufgerufen, 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 select , „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. 1.4 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. 1.5 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: - 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
mysql8.0 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. - Durch den Analysator wird eine lexikalische Analyse durchgeführt, um die Schlüsselelemente der SQL-Anweisung zu extrahieren. Die obige Anweisung ist beispielsweise eine Abfrageauswahl und 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. - Im nächsten Schritt bestimmt der Optimierer den Ausführungsplan. Die obige SQL-Anweisung kann auf zwei Arten ausgeführt werden : (1) Fragen Sie zuerst die Studententabelle nach Studenten ab, deren Name „Zhang San“ ist, und bestimmen Sie dann, ob das Alter 18 Jahre beträgt. (2) 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: - Fragen Sie zuerst die Daten von Zhang San ab. Wenn ein Cache vorhanden ist, wird dieser auch verwendet.
- 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 redo log auf. Zu diesem Zeitpunkt wechselt redo log in den prepare und teilt dem Executor mit, dass die Ausführung abgeschlossen ist und jederzeit übermittelt werden kann. - Nach Erhalt der Benachrichtigung zeichnet der Executor
binlog auf und ruft dann die Engine-Schnittstelle auf, um redo log an den festgeschriebenen Status zu übermitteln. - 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 redo log , daher wissen wir, dass sie keine Transaktionen unterstützt. Das bedeutet also nicht, dass nicht nur ein Protokollmodul verwendet werden kann, sondern 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 prepare Pre-Commit“ einführen? Hier verwenden wir einen Beweis durch Widerspruch, um zu erklären, warum wir das tun. - Schreiben Sie zuerst das Redo-Log und committen Sie es direkt, dann schreiben Sie das Binlog . Angenommen, die Maschine stürzt nach dem Schreiben
redo log ab und binlog wird nicht geschrieben. Nach dem Neustart der Maschine stellt die Maschine die Daten über redo log wieder her, aber das bingog 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. - Schreiben Sie zuerst das Binlog und dann das Redo-Log . Angenommen, nach dem Schreiben
binlog wird die Maschine abnormal neu gestartet. Da kein redo log vorhanden ist, kann die Maschine diesen Datensatz nicht wiederherstellen. binlog hat jedoch einen anderen Datensatz. Dann führt der gleiche Grund wie oben zu Dateninkonsistenzen.
Wenn redo log angewendet wird, ist die Situation anders. Nach dem Schreiben binglog verhindert das Senden redo log das Auftreten der oben genannten Probleme und stellt so die Datenkonsistenz sicher. Die Frage ist also: Gibt es eine Extremsituation? Angenommen, redo log befindet sich im Pre-Commit-Zustand und binglog 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: - Stellen Sie fest, ob
redo log vollständig ist. Wenn dies der Fall ist, führen Sie sofort ein Commit durch. - Wenn sich
redo log nur im vorab festgeschriebenen, aber noch nicht commit Zustand befindet, ermittelt das System, ob binlog vollständig ist. Wenn es vollständig ist, wird redo log festgeschrieben; wenn es unvollständig ist, wird die Transaktion zurückgesetzt.
Dadurch wird das Problem der Datenkonsistenz gelöst. Abschluss-
Mysql ist hauptsächlich in Server 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. - Die Engine-Schicht ist Plug-in-basiert und umfasst derzeit hauptsächlich MyISAM, InnoDB, Memory usw.
- 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
- Der Ausführungsprozess für Update-Anweisungen läuft wie folgt ab: Analyzer ----》Berechtigungsprüfung ----》Executor---》Engine---Redo-Log-Vorbereitung---》Binlog---》Redo-Log-
commit
Dies ist das Ende dieses Artikels über die Ausführung einer SQL-Anweisung in MySQL. Weitere Informationen zur Ausführung von SQL-Anweisungen in MySQL finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:- So ermitteln Sie die Abfragezeit einer MySQL-SQL-Anweisung in PHP
- Führt MySQL die Aktualisierungsanweisung erneut aus, wenn sie dieselben Daten enthält wie die ursprüngliche?
|