《mysql基礎》第2集-修改語句的執行順序

上一節《查詢語句的執行順序》總體梳理了一下mysql中查詢語句的執行順序,這次梳理一下mysql的修改語句的執行順序

其實修改語句的執行順序跟查詢語句的順序一樣,

1:連接器-處理鏈接,驗證權限

2:查詢緩存-緩存失效,所以不建議在修改頻繁的表上用查詢緩存

3:分析器-詞法分析,語法分析,驗證否和mysql的標準

4:優化器-選擇用那個id查詢符合條件的數據

6:執行器-校驗表權限,調用執行引擎,返回結果

mysql的server層有binLog

innoDB的執行引擎有redoLog

log文件系統是一個非常經典的設計模式

舉個例子,孔乙己所在的咸亨飯店,有很多人賒賬,掌櫃的很忙的時候,不會直接記一筆賒賬記錄在賬本里面,而是在櫃檯上的小黑板上記下這次賒賬的記錄,然後在空閒的時候,再把小黑板上的記錄轉記到賬本里面。這個小黑板的功能,就相當於redoLog

InnoDB的這項優化技術叫WAL。write-ahead-logging.先寫日誌,再寫磁盤。如果mysql出現的異常,之前的操作都會在內存redoLog中和磁盤中,這中能力叫crash-safe。

不過InnoBD的小黑板很大,可以分爲4個,每個黑板1G大小,像個循環鏈表,從頭開始寫,寫到末尾,會把開頭的記錄寫到硬盤裏買呢,然後空餘的空間寫新的操作記錄。

InnoDB的redoLog實現了crash-safe能力,但是InnoDB只是Mysql的一個執行引擎,其餘的執行引擎可能沒有redoLog。所以Mysq在Server層也有自己的日誌系統-binLog,binLog記錄的是update的邏輯操作。

所以在執行update語句的時候,到底發生了什麼呢

1:執行器執行update語句,引擎會先根據索引或者其餘的篩選條件,把符合的結果集返回給執行器,

2:執行器獲取的結果集數據,依次更新,然後調用執行引擎寫入新的數據

3:執行引擎將數據更新到內存中,然後把更新操作寫入redoLog,此時redolog記錄是prepare狀態,告訴執行器隨時可以提交事物

4:執行器把這個update操作寫入binLog,並寫入磁盤

5:執行器調用執行引擎把剛纔的redoLog的狀態改爲commit狀態,更新完成。

很有意思的問題,redoLog和binLog到底有什麼不同呢

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章