標籤:
每隔0.1秒就刷一次MYSQL檔案的變化,並閃動標示出來,以觀察SQL執行時,MYSQL的處理順序。
watch -n 0.1 -d stat /var/lib/mysql/ib_logfile0 /var/lib/mysql/ib_logfile1 /var/lib/mysql/ibdata1
我理解的執行順序:(還缺插入緩衝的合并)很粗的架構理解,但折騰了許多天。
硬碟的資料檔案mytable.ibd存有mytable這個表id=1的記錄,name=123的。(innodb_per_file設定為on)
當UPDATE MYTABLE SET NAME=’ABC’ WHERE ID=1這個語句執行時,系統產生一個LSN是1
INNODB READ THREAD 將這條記錄以及詞典從硬碟中讀到記憶體的資料頁DATA PAGE中,並寫到記憶體中一塊UNDO BUFFER中。並對這條記錄加鎖(如果有索引就是行級鎖,否則就是表鎖)
INNODB WRITE THREAD將這條記錄的UNDO日誌寫到UNDO資料表空間的復原段中(預設是ibdata1檔案中),
INNODB對資料頁中的記錄進行更新,變成髒頁後,然後把LSN=1的這條日誌,寫進REDOLOG BUFFER;
到commit時,無論是顯式還是隱式,根據innodb_flush_log_at_trx_commit指定的方式,重新整理LSN到REDO LOG檔案中,然後釋放鎖。這時PURGE THREAD就可以對UNDOLOG進行清理。PURGE是按事務號不按日誌。
INNODB MASTER THREAD會擇機把髒頁刷寫回資料檔案mytable.ibd中。具體過程INNODB先把髒頁的資料拷貝到記憶體池中一個DOUBLE WRITE BUFFER中,然後調用系統FSYNC()重新整理系統緩衝來確認真正寫入了,然後再將髒頁FLUSHD到對應的資料檔案中mytable.idb後,釋放髒頁。
INNODB MASTER THREAD會擇機已經寫回資料檔案的日誌LSN,做為CHECKPOINT寫進REDOLOG中。
更直觀性mysql整體邏輯機構圖:
mysql sql執行過程,對理解mysql執行計畫有很大協助
當 ‘innodb_flush_log_at_trx_commit = x ’x=0,1,2 各值時刷盤機制
mysql 記憶體配置,對理解記憶體配置很有參考意義
INNODB 記憶體與硬碟之間互動。
watch -n 0.1 -d stat /var/lib/mysql/ib_logfile0 /var/lib/mysql/ib_logfile1 /var/lib/mysql/ibdata1
關於MYSQL 和INNODB的邏輯關係圖。最好的理解是一點點動手做,觀察,記錄,思考。