Dieser Artikel vermittelt Ihnen relevantes Wissen über MySQL. Am Beispiel von MYSQL wird der Abfrageprozess der MySQL-Datenbank erläutert und es jedem ermöglicht, einige Teile der Datenbank zu verstehen Verständnis, ich hoffe, es wird für alle hilfreich sein.
Empfohlenes Lernen: MySQL-Video-Tutorial
Wir müssen bestimmte Daten, die den Anforderungen entsprechen, aus der Datenbank abrufen. Wir können problemlos SQL schreiben, z. B. „Wählen Sie A B C FROM T WHERE ID = XX“ und senden Sie diese dann an die Datenbank Was genau macht die Datenbank, wenn sie eine Anfrage stellt?
Heute nehmen wir MYSQL als Beispiel, um den Abfrageprozess der MySQL-Datenbank zu veranschaulichen und jedem einige Teile der Datenbank verständlich zu machen.
MySQL kann hauptsächlich in Serverschicht und Speicher-Engine-Schicht unterteilt werden.
Serverschicht umfasst Konnektoren, Abfrage-Caches, Analysatoren, Optimierer, Ausführer usw. Alle speicherübergreifenden Engine-Funktionen werden in dieser Schicht implementiert, z. B. gespeicherte Prozeduren, Trigger, Ansichten, Funktionen usw. und ein allgemeines Protokoll Modul Binlog-Protokollmodul;
Speicher-Engine-Schicht ist für die Datenspeicherung und den Datenabruf verantwortlich. Sein Architekturmodell ist Plug-in und unterstützt mehrere Speicher-Engines wie InnoDB, MyISAM und Memory. Die derzeit am häufigsten verwendete Speicher-Engine ist InnoDB (die Transaktionen unterstützt), die seit MySQL-Version 5.5.5 zur Standard-Speicher-Engine geworden ist.
Der Connector ist hauptsächlich für die Benutzeranmeldung bei der Datenbank und die Benutzeridentitätsauthentifizierung 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 beendet die Ausführung.
Wenn das Benutzerkontokennwort übergeben wurde, fragt der Connector alle Berechtigungen des Benutzers in der Berechtigungstabelle ab. Nachfolgende Beurteilungen der Berechtigungslogik in diesem Zusammenhang basieren auf den zu diesem Zeitpunkt gelesenen Berechtigungsdaten, d Solange die Verbindung nicht getrennt wird, ist der Benutzer nicht betroffen, auch wenn der Administrator die Berechtigungen des Benutzers ändert.
Nachdem der Client eine Verbindung mit dem Server hergestellt hat, fragt MySQL beim Ausführen der Abfrageanweisung zunächst den Cache ab, um zu überprüfen, ob diese SQL 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. Die Ergebnisse werden nach Abschluss zwischengespeichert, um den nächsten Aufruf zu erleichtern.
Wenn Sie das sehen, werden Ihre Augen leuchten und Sie werden den Drang verspüren, diese Funktion sinnvoll zu nutzen.
Tatsächlich wird die Verwendung des Abfragecaches hier nicht empfohlen. Der Abfragecache schlägt sehr häufig fehl. Solange es eine Aktualisierung einer Tabelle gibt, werden alle Abfragecaches auf dieser Tabelle geleert. Es ist also möglich, dass Sie sich die Mühe gemacht haben, die Ergebnisse zu speichern, nur um sie durch ein Update zu löschen, bevor Sie sie überhaupt verwendet haben. Bei Datenbanken mit hohem Aktualisierungsdruck ist die Trefferquote des Abfragecaches sehr niedrig. Es sei denn, es handelt sich um eine Art Tabelle, die für längere Zeit nicht aktualisiert wird, wie z. B. die Systemkonfigurationstabelle. Aber sollten wir diese Art von Systemkonfiguration nicht auf die Konfigurationsplattform stellen?
Die Abfrage-Cache-Funktion wurde in MYSQL8.0 gelöscht. Beamte glauben auch, dass diese Funktion relativ wenige praktische Anwendungsszenarien hat, und haben sie daher einfach gelöscht.
Wenn MySQL nicht auf den Abfragecache trifft, gelangt es in den Analysator. Der Analysator wird hauptsächlich zur Analyse des Zwecks der SQL-Anweisung verwendet. Der Analysator ist hauptsächlich in die folgenden zwei Schritte unterteilt:
Lexikalische Analyse : Eine SQL-Anweisung besteht aus mehreren Zeichenfolgen. Zunächst müssen Schlüsselwörter extrahiert werden, z. B. „select“, die Abfragetabelle, Feldnamen, Abfragebedingungen usw . muss extrahiert werden.
Grammatikanalyse: Basierend auf den Ergebnissen der lexikalischen Analyse bestimmt die Grammatikanalyse hauptsächlich, ob die von Ihnen eingegebene SQL-Anweisung korrekt ist und der MYSQL-Syntax entspricht. Wenn Ihre Anweisung falsch ist, erhalten Sie die Meldung „Sie haben einen Fehler in.“ Fehlermeldung „Ihre SQL-Syntax“.
Das lexikalische Analyseprogramm zerlegt die gesamte Abfrageanweisung in verschiedene Arten von Token, und die Syntaxanalyse wandelt die „verschiedenen Arten von Token“ basierend auf der definierten Systemsprache in sinnvolle Kombinationen für MySQL um. Schließlich generiert das System einen Syntaxbaum (AST), bei dem es sich um die Datenstruktur handelt, auf die sich der Optimierer verlässt.
Nachdem MySQL den Analysator durchlaufen hat, weiß es, was Sie tun möchten. Bevor die Ausführung beginnt, muss sie vom Optimierer verarbeitet werden.
Warum brauchen Sie einen Optimierer?
Der Optimierer enthält viele komplexe Optimierungstechniken, die oft mehr sind, als die besten Programmierer beherrschen. Die automatische Optimierung des Systems kommt der Bereitstellung dieser Optimierungstechnologien für jedermann gleich.
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 Der Optimierer kann Hunderte verschiedener Ausführungspläne berücksichtigen, während Programmierer im Allgemeinen nur eine begrenzte Anzahl von Möglichkeiten berücksichtigen können.
können auf der Grundlage dieser Informationen einen effektiven Ausführungsplan auswählen, aber für Benutzerprogramme ist es schwierig, diesen zu erhalten Informationen ;
Kurz gesagt, der Optimierer ändert die Form des Syntaxanalysebaums, ändert den Syntaxanalysebaum in einen Abfragebaum und bestimmt den Ausführungsplan.
MySQL weiß, was Sie über den Analysator tun möchten und wie es über den Optimierer zu tun ist, also tritt es in die Executor-Phase ein und beginnt mit der Ausführung von Anweisungen.
Wenn Sie mit der Ausführung beginnen, müssen Sie zunächst überprüfen, ob der Benutzer die Berechtigung zum Ausführen der Abfrage hat. Andernfalls wird der Fehler „Keine Berechtigung“ zurückgegeben. Wenn es über die entsprechende Berechtigung verfügt, ruft es die Schnittstelle der Engine auf und gibt das Ergebnis der Schnittstellenausführung zurück.
Wir verwenden die folgende echte SQL-Abfrageanweisung, um den Ausführungsprozess der MYSQL-Abfrage zu analysieren
select id,name,sex,phoone from user t where t.age='26' and t.account='javadaily'
Zunächst muss der Client eine Verbindung zur Datenbank herstellen Die Fehlermeldung wird direkt zurückgegeben. Wenn sie korrekt ist, fahren Sie mit dem nächsten Schritt fort.
Vor MYSQL8.0 würde es zuerst zum Abfragecache gehen und diese SQL-Anweisung als Schlüssel verwenden, um abzufragen, ob ein Ergebnis im Speicher vorhanden ist. Wenn ein Ergebnis vorhanden ist, wird zunächst festgestellt, ob es eine Berechtigung hat . Wenn es die Berechtigung hat, wird es an den Client zurückgegeben, andernfalls wird ein Fehler gemeldet. Wenn es keinen Treffer aus dem Abfragecache gibt, fahren Sie mit dem nächsten Schritt fort
Führen Sie eine lexikalische Analyse über den Analysator durch und extrahieren Sie die Schlüsselelemente Die obige Anweisung ist beispielsweise eine Abfrageauswahl und der abzufragende Tabellenname ist user code>, die abzufragenden Spalten sind <code>id,name,sex, phone
und die Abfragebedingungen sind age=26
und account=javadailly
. Stellen Sie dann fest, ob die SQL-Anweisung Syntaxfehler aufweist, z. B. ob die Schlüsselwörter korrekt sind usw. Wenn kein Problem vorliegt, fahren Sie mit dem nächsten Schritt fort. user
,需要查询的列为id,name,sex,phoone
,查询条件是age=26
和account=javadailly
。然后判断这个sql语句是否有语法错误,比如关键词是否正确等等,如果检查没问题就执行下一步。
上面的SQL有两种执行方案,优化器根据自己的优化算法选择执行效率最高的a方案(统计信息不准可能导致优化器选择错误的执行方案),确定了优化方案后就开始执行。
a. 先查询 account=javadaily
的用户,然后判断 age
是否等于26 b. 先找出 age=26
的用户,再查询 account=javadaily
account=javadaily
ab und ermitteln Sie dann, ob age
gleich 26 ist. b Finden Sie zuerst den Benutzer von age heraus =26
Benutzer, dann fragen Sie den Benutzer
account=javadaily
nach Berechtigungsüberprüfung. Wenn eine Abfrageberechtigung vorliegt, rufen Sie andernfalls die Datenbank-Engine-Schnittstelle auf, um das Ausführungsergebnis zurückzugeben. Es wird ein Fehler gemeldet. Empfohlenes Lernen: 🎜MySQL-Video-Tutorial🎜🎜Das obige ist der detaillierte Inhalt vonEine eingehende Analyse des Ausführungsprozesses von MySQL-Abfrageanweisungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!