Heim >Datenbank >MySQL-Tutorial >Wie läuft der gesamte Prozess der Ausführung einer Anweisung in MySQL ab?
Die logische Architektur von MySQL ist wie folgt unterteilt: die Serverschicht und die Speicher-Engine-Schicht.
Vorgänge, die nichts mit der Speicher-Engine zu tun haben, werden auf der Serverebene ausgeführt, und die Speicher-Engine-Ebene ist für den Datenzugriff verantwortlich.
Im Folgenden wird die Funktion jedes Schritts gemäß dem Prozess im Bild oben vorgestellt. Hier nehmen wir die Abfrage eines Datensatzes als Beispiel.
Dieser Schritt dient hauptsächlich der Verwaltung von Verbindungen und der Berechtigungsüberprüfung.
Verantwortlich für die Verwaltung von Client-Verbindungen, z. B. mysql -u root -p
, die zwischen dem Client und dem Connector ausgeführt werden. Die Verwendung wird in lange Verbindungen und kurze Verbindungen unterteilt Lange Verbindung, da der Verbindungsaufbau ein relativ komplexer Prozess ist. Lange Verbindungen bieten jedoch auch Optimierungspotenzial, d. h. zu viele lange Verbindungen belegen mehr Speicher, wenn große Abfragevorgänge ausgeführt werden. mysql -u root -p
,就是客户端与连接器之间完成的,连接分为长连接和短连接,建议使用长连接,因为建立连接是相对复杂的一个过程。但是长连接也有优化的空间,即长连接过多,随着执行大的查询操作,会占用较多的内存。
建立连接完成之后,连接器会判断该用户的权限,之后用户的操作都会基于权限来判定是否允许。
这一步主要是词法分析和语法分析。
词法分析主要是判定用户想做什么,比如select 就是想要查询。
语法分析主要是判定用户输入的SQL是否符合Mysql的语法。
经过分析器,Mysql已经知道用户想要干什么了,但是对于相同的一条SQL语句,对于Mysql具体实施的时候,可能有多种方法去实现,效率也就不一样。
在优化器这一步,mysql需要判定怎么样执行才是最优的效率。
这一步主要是操作引擎和返回结果。操作存储引擎层以遍历数据表,查找符合条件的数据并将其返回给客户端。
与一条SQL查询语句相同的是,在Mysql中同样要经过连接器、分析器、优化器、执行器,也要用到存储引擎来进行数据的存取。
不同的是,更新语句需要涉及到两个重要的日志模块,redo log和binlog
一家饭店生意红火,但作为一家饭店来说,免不了每天都有赊账和来还账的。
如果有大量的赊账和还账的人,老板将无法用一块粉板来记录一个月的赊账记录。
所以老板想到可以把所有的赊账记录写到账本上,而粉板上写的都是短时间的,等下班了之后,拿粉板上的和账本进行对账。
在这个例子中,粉板就是redo log
,账本就是mysql中的记录,我们用还账类比一下mysql的更新过程,如果每次有人更新,我们都去mysql
中找到这条记录,效率很低,所以mysql的思路和这个老板一致,更新操作先放到redo log
中,过一段时间再慢慢消化。
这种思路叫WAL技术,即Write Ahead Logging
技术,先写日志,再写磁盘。
老板必须停下手头的工作,如果粉板已经满了而且老板还没有下班。mysql中的redo log总共可以记录4GB的操作
当write pos 追上check point
,mysql这个老板就要去处理一下redo log了。
除此之外,有了redo log
持久化,数据库即使异常重启也不会丢日志,这是crash saf
Anders Ja, die Aktualisierungserklärung muss zwei wichtige Protokollmodule umfassen, Redo Log und Binlog
7.redo logEin Restaurant boomt, aber als Restaurant ist es unvermeidlich, jeden Tag Guthabenkonten und Rückzahlungen zu haben.Wenn es viele Menschen gibt, die Kredite aufnehmen und ihre Schulden zurückzahlen, wird der Chef nicht in der Lage sein, die Kreditunterlagen eines Monats an einer rosa Tafel aufzuzeichnen.
🎜Also dachte der Chef daran, alle Kreditunterlagen in das Hauptbuch zu schreiben, und was auf die rosa Tafel geschrieben wurde, war für einen kurzen Zeitraum nach der Arbeit die rosa Tafel, um das Hauptbuch abzugleichen. 🎜🎜In diesem Beispiel ist das Pink Board dasRedo-Log
und das Hauptbuch ist der Datensatz in MySQL. Verwenden wir die Rückzahlungsanalogie, um den Aktualisierungsprozess von MySQL zu vergleichen zu Dieser Datensatz befindet sich in MySQL
, was sehr ineffizient ist, sodass die Idee von MySQL mit diesem Chef übereinstimmt. Der Aktualisierungsvorgang wird zuerst im Redo-Protokoll
abgelegt und dann langsam verdaut nach einer gewissen Zeit. 🎜🎜Diese Idee wird WAL-Technologie genannt, bei der es sich um die Write Ahead Logging
-Technologie handelt. Zuerst wird das Protokoll und dann die Festplatte geschrieben. 🎜🎜Der Chef muss aufhören, was er tut, wenn die rosa Tafel voll ist und der Chef die Arbeit noch nicht verlassen hat. Das Redo-Log in MySQL kann insgesamt 4 GB an Vorgängen aufzeichnen Anweisung Was ist der gesamte Prozess? 🎜🎜Darüber hinaus verliert die Datenbank mit der Redo-Log
-Persistenz keine Protokolle, selbst wenn sie abnormal neu gestartet wird. Dies ist der absturzsichere Mechanismus
, aber Sie müssen trotzdem bezahlen Beachten Sie es. Ja, Redo-Log ist einzigartig für die Innodb-Speicher-Engine. 🎜🎜8.bin-Protokoll🎜🎜binlog ist das Server-Layer-Protokoll und kann auf alle Speicher-Engines angewendet werden. 🎜🎜Da es also ein Binlog gibt, warum müssen wir dann ein Redo-Log erstellen, das exklusiv für die Innodb-Speicher-Engine gilt? 🎜🎜Da MySQL zu Beginn keine Innodb-Engine hatte, sondern die Myisam-Engine, die Binlog verwendete, das Binlog jedoch auf die Archivierung beschränkt war und keinen absturzsicheren Mechanismus hatte, habe ich ein Redo-Log hinzugefügt. 🎜🎜🎜🎜Redo-Log ist einzigartig für die Innodb-Speicher-Engine, während Binlog einzigartig für die Serverschicht ist. 🎜🎜🎜🎜Redo-Log speichert physische Protokolle und Binlog ist ein logisches Protokoll Wenn die Größe zu groß ist, muss sie verarbeitet und überschrieben werden. Wenn das Binlog-Protokoll mit einer Protokolldatei gefüllt ist, wird eine neue Protokolldatei erstellt. 🎜🎜🎜Im Folgenden wird die Aktualisierung einer Datenzeile mit der ID 2 als Beispiel genommen: 🎜🎜🎜Das helle Kästchen in der Abbildung zeigt an, dass es in InnoDB ausgeführt wird, und das dunkle Kästchen zeigt an, dass es im Executor ausgeführt wird. 🎜🎜🎜🎜Der Executor sucht zunächst nach der Engine, um die Zeilen-ID=2 zu erhalten. Die ID ist der Primärschlüssel, und die Engine verwendet direkt die Baumsuche, um diese Zeile zu finden. Wenn sich die Datenseite, auf der sich die Zeile ID=2 befindet, bereits im Speicher befindet, wird sie direkt an den Executor zurückgegeben. Andernfalls muss sie von der Festplatte in den Speicher gelesen und dann zurückgegeben werden.
Der Executor ruft die von der Engine bereitgestellten Zeilendaten ab, addiert 1 zu diesem Wert, zum Beispiel war er früher N, aber jetzt ist er N+1, ruft eine neue Datenzeile ab und ruft dann die Engine auf Schnittstelle zum Schreiben dieser neuen Datenzeile.
Die Engine aktualisiert diese neue Datenzeile im Speicher und zeichnet den Aktualisierungsvorgang im Redo-Log auf. Zu diesem Zeitpunkt befindet sich das Redo-Log im Vorbereitungszustand. Informieren Sie anschließend den Testamentsvollstrecker darüber, dass die Ausführung abgeschlossen ist und die Transaktion jederzeit eingereicht werden kann. Während der Ausführung der Operation generiert der Executor ein Binlog und schreibt es auf die Festplatte.
Der Executor ruft die Commit-Transaktionsschnittstelle der Engine auf, und die Engine ändert das gerade geschriebene Redo-Protokoll in den Commit-Status, und die Aktualisierung ist abgeschlossen.
Das obige ist der detaillierte Inhalt vonWie läuft der gesamte Prozess der Ausführung einer Anweisung in MySQL ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!