MySQL kann in zwei Teile unterteilt werden: die Serverschicht und die Speicher-Engine-Schicht
Die Serverschicht umfasst Connectors und Abfrage-Cache, Analysatoren, Optimierer, Executoren usw., die die meisten Kerndienstfunktionen von MySQL und alle integrierten Funktionen abdecken. Alle speicherübergreifenden Engine-Funktionen sind in dieser Ebene implementiert, z. B. gespeicherte Prozeduren, Trigger, Ansichten usw .
Die Storage-Engine-Schicht ist für die Speicherung und den Abruf von Daten 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
(empfohlenes kostenloses Lernvideo-Tutorial: MySQL-Video-Tutorial)
Werfen wir einen Blick auf den SQL-Ausführungsprozess
Connector
Im ersten Schritt stellen Sie zunächst eine Verbindung zur Datenbank her und der Connector empfängt Sie zu diesem Zeitpunkt. Der Connector ist dafür verantwortlich, eine Verbindung mit dem Client herzustellen, Berechtigungen einzuholen, die Verbindung aufrechtzuerhalten und zu verwalten.
Nach Abschluss der Verbindung befindet sich die Verbindung in einem Ruhezustand, wenn Sie keine weiteren Aktionen ausführen sehen Sie es im Befehl show Processlist
Wenn der Client zu lange inaktiv ist, wird er vom Connector automatisch getrennt. Diese Zeit wird durch den Parameter wait_timeout gesteuert. Der Standardwert beträgt 8 Stunden.
Der Vorgang des Verbindungsaufbaus ist normalerweise kompliziert, daher sollten die Aktionen zum Verbindungsaufbau während der Verwendung minimiert werden, d. h. versuchen, ihn zu verwenden Lange Verbindungen
Nachdem jedoch alle langen Verbindungen verwendet wurden, kann es vorkommen, dass der von MySQL belegte Speicher sehr schnell zunimmt. Dies liegt daran, dass der von MySQL während der Ausführung vorübergehend verwendete Speicher im Verbindungsobjekt verwaltet wird. Diese Ressourcen werden erst freigegeben, wenn die Verbindung getrennt wird.
Wie lässt sich dieses Problem lösen?
1. Trennen Sie regelmäßig lange Verbindungen. Nach längerer Verwendung oder nachdem das Programm festgestellt hat, dass eine große Abfrage ausgeführt wurde, die Speicher beansprucht, wird die Verbindung getrennt, und dann wird die Abfrage benötigt und dann erneut verbunden.
2. Wenn Sie MySQL 5.7 oder neuer verwenden, können Sie die Verbindungsressource neu initialisieren, indem Sie mysql_reset_connection jedes Mal ausführen, nachdem Sie einen relativ großen Vorgang ausgeführt haben. Dieser Vorgang erfordert keine erneute Verbindung und keine Berechtigungsüberprüfung, aber die Verbindung wird in den Zustand zurückversetzt, in dem sie gerade erstellt wurde
Abfragecache
Nachdem die Verbindung hergestellt wurde, Sie können die Select-Anweisung ausführen. Die Ausführungslogik kommt zum zweiten Schritt: Abfragecache. Nachdem MySQL eine Abfrageanforderung erhält, geht es zunächst zum Abfragecache, um zu sehen, ob diese Anweisung bereits zuvor ausgeführt wurde. Zuvor ausgeführte Anweisungen und ihre Ergebnisse können in Form von Schlüssel-Wert-Paaren direkt im Speicher zwischengespeichert werden. Der Schlüssel ist die Abfrageanweisung und der Wert ist das Ergebnis der Abfrage. Wenn Ihre Abfrage den Schlüssel direkt in diesem Cache finden kann, wird der Wert direkt an den Client zurückgegeben
Befindet sich die Anweisung nicht im Abfragecache, wird die nachfolgende Ausführungsphase fortgesetzt. Nach Abschluss der Ausführung werden die Ausführungsergebnisse im Abfragecache gespeichert. Sie können sehen, dass MySQL das Ergebnis direkt zurückgeben kann, ohne nachfolgende komplexe Vorgänge auszuführen.
Aber in den meisten Fällen wird der Abfrage-Cache nicht verwendet. Warum? Das Zwischenspeichern von Abfragen schadet oft mehr als es nützt.
Der Abfragecache läuft sehr häufig ab, solange eine Aktualisierung einer Tabelle vorliegt, werden alle Abfragecaches für diese Tabelle geleert. Es ist also möglich, dass Sie sich die Mühe gemacht haben, die Ergebnisse zu speichern, und bevor Sie sie überhaupt verwendet haben, wurden sie durch ein Update gelöscht. Bei Datenbanken mit hohem Aktualisierungsdruck ist die Trefferquote des Abfragecaches sehr niedrig. Es sei denn, Ihr Unternehmen verfügt über eine statische Tabelle, die über einen längeren Zeitraum aktualisiert wird
Sie können den Parameter query_cache_type auf DEMAND setzen, sodass der Abfragecache nicht für die Standard-SQL-Anweisungen verwendet wird
MySQL Version 8.0 löscht direkt die gesamte Abfrage-Cache-Funktion, was bedeutet, dass diese Funktion in 8.0 vollständig fehlt
Analyzer
Wenn der Abfrage-Cache vorhanden ist nicht getroffen wird, beginnt die eigentliche Ausführung der Anweisung. Zunächst muss MySQL wissen, was Sie tun möchten, also muss es die SQL-Anweisung analysieren.
Der Analysator führt zunächst eine „lexikalische Analyse“ durch. Was Sie eingeben, ist eine SQL-Anweisung, die aus mehreren Zeichenfolgen und Leerzeichen besteht. MySQL muss identifizieren, was die darin enthaltenen Zeichenfolgen sind und was sie darstellen.
Nach Abschluss dieser Identifizierungen muss eine „Syntaxanalyse“ durchgeführt werden. Anhand der Ergebnisse der lexikalischen Analyse ermittelt der Syntaxanalysator, ob die von Ihnen eingegebene SQL-Anweisung die MySQL-Syntax
gemäß den grammatikalischen Regeln des Optimierers
erfüllt Wenn Sie den Analysator durchlaufen haben, weiß MySQL, was Sie tun möchten. Bevor die Ausführung beginnt, muss sie vom Optimierer verarbeitet werden.
Der Optimierer bestimmt, welcher Index verwendet werden soll, wenn die Tabelle mehrere Indizes enthält oder wenn eine Anweisung mehrere Tabellenzuordnungen (Joins) hat. Er bestimmt die Verbindungsreihenfolge jeder Tabelle.
Nach dem Die Optimierungsphase ist abgeschlossen, der Ausführungsplan dieser Anweisung wird bestimmt und dann tritt sie in die Executor-Phase
Executor
einWenn Sie die Ausführung starten, müssen Sie zunächst feststellen, ob Sie über die Berechtigung zum Ausführen von Abfragen für diese Tabelle T verfügen. Wenn nicht, wird der Fehler „Keine Berechtigung“ zurückgegeben.
Wenn Sie über die Berechtigung verfügen, öffnen Sie die Tabelle und Ausführung fortsetzen. Wenn die Tabelle geöffnet wird, verwendet der Executor die von der Engine bereitgestellte Schnittstelle, um gemäß der Engine-Definition der Tabelle auszuführen.
Zu diesem Zeitpunkt hat die Serverschicht die Ausführung der spezifischen Engine-Layer-Logik abgeschlossen. Wir werden Analysieren Sie es im nächsten Artikel
Das obige ist der detaillierte Inhalt vonAnalyse des MySQL-Ausführungsprozesses. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!