MySQL InnoDB update流程

T1YSL發表於2020-12-22

以update test set idx = 2 where id=10;為例
1. server層,語法解析,解析成mysql認識的語法,查詢什麼表,什麼欄位,生成查詢路徑樹,選擇最優查詢路徑
2. InnoDB儲存引擎,判斷id=10這行對應的頁是否在快取池裡,如果不在,則將對應的頁從datafile中讀到InnoDB緩衝池中,並對相關記錄加獨佔鎖
3. undo tablespace回滾段  ,idx修改之前的值和對應的主鍵、事務id原來的資訊寫入undo tablespace回滾段
4. 更新快取頁中資料,並將更新記錄和生成的LSN值(日誌子序列號) 寫入log buffer。更新之後緩衝池裡的頁就是髒頁了。
5.    提交事務時,根據innodb_flush_log_at_trx_commit設定,用不同方式將log buffer中的更新記錄重新整理到redo log中
然後寫binlog ,寫完之後後開始binlog的commit,同步到磁碟
binlog同步後把binlog檔案和postition(binlog檔案內的位置)寫到redo log 中,然後在redo log寫入一個commit標誌,然後就完成了這個事務的提交。接下來釋放獨佔鎖
6.後臺i/o執行緒將快取中合適的髒頁重新整理到磁碟資料檔案中,如果開啟雙寫快取功能,需要先複製一份髒頁到雙寫緩衝區,等其中的資料落盤,再從緩衝池把髒頁重新整理到各個資料檔案中。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2744277/,如需轉載,請註明出處,否則將追究法律責任。

相關文章