MySQL更新操作也會先走一遍查詢的流程,與查詢流程不一樣的是,更新流程還涉及兩個重要的日誌模組,redo log和bin log。
redo log
InnoDB 的 redo log 是固定大小的,比如可以配置為一組 4 個檔案,每個檔案的大小是 1GB,那麼此時redo log總共就可以記錄 4GB 的操作。從頭開始寫,寫到末尾就又回到開頭迴圈寫
當有一條記錄需要更新時,innodb引擎會把操作記錄到redo log中,並在記憶體中修改這條記錄,此時更新操作就已經完成了。innodb引擎會在適當的時候將redo log中的操作迴圈寫入到磁碟中。寫入過程是不斷往後推移並且迴圈的,會不斷擦除redo log中的記錄,擦除記錄前要把記錄更新到資料檔案。
bin log
redo log 是 InnoDB 引擎特有的日誌,而 Server 層也有自己的日誌,稱為 binlog(歸檔日誌)
有了對這兩個日誌的概念性理解,我們再來看執行器和 InnoDB 引擎在執行這個簡單的 update 語句時的內部流程。
1.執行器先找引擎取要更新的記錄,如果這一行所在的資料頁本來就在記憶體中,就直接返回給執行器;否則,需要先從磁碟讀入記憶體,然後再返回。
2.執行器拿到引擎給的行資料,把這個值更新,比如原來是 N,現在就是 N+1,得到新的一行資料,再呼叫引擎介面寫入這行新資料。
3.引擎將這行新資料更新到記憶體中,同時將這個更新操作記錄到 redo log 裡面,此時 redo log 處於 prepare 狀態。然後告知執行器執行完成了,隨時可以提交事務。
4.執行器生成這個操作的 binlog,並把 binlog 寫入磁碟。
5.執行器呼叫引擎的提交事務介面,引擎把剛剛寫入的 redo log 改成提交(commit)狀態,更新完成。
這個 update 語句的執行流程圖,圖中淺色框表示是在 InnoDB 內部執行的,深色框表示是在執行器中執行的。
本作品採用《CC 協議》,轉載必須註明作者和本文連結