InnoDB的Master Thread工作原理

2022-03-31 20:05:49 字數 2341 閱讀 2247

本文主要是通過閱讀姜承堯先生的《mysql技術內幕》,從中了解到master thread的工作原理。我主要寫下自己的學習筆記,好記憶不如爛筆頭。

master thread可以分為主迴圈(loop),background迴圈,flush迴圈,suspend迴圈。可以這麼理解,先執行主迴圈,如果當前資料庫空閒,或者呼叫stop關閉命令時,進入background迴圈,在background迴圈最後,如果當前資料庫不再空閒,就重新進入主迴圈,否則進入flush迴圈。在flush迴圈最後,如果資料庫還是空閒就進入suspend迴圈,master thread掛起。

主迴圈分成兩部分,一部分是每一秒鐘要做的事情,另一部分是每10秒鐘要做的事情。偽**如下:

loop:

for(int i=0;i<10;i++)

if(buffer_pool_modified_page_ratio_pct > innodb_max_dirty_page_pct)else if(enable adaptive flush)

if(not user activity)} }

doging something;

do log buffer flush to disk;

do merge at most 5% innodb_io_capacity insert buffer;

do full purge,at most 20 undo pages;

if(buffer_pool_modified_page_ratio_pct < 70%)else

do fuzzy checkpoint;

}background loop迴圈偽**如下:

background loop:

do full purge,at most 20 undo pages;

do merge 100% innodb_io_capacity insert buffer;

if(not idle)else

flush loop迴圈偽**如下:

flush loop:

do buffer pool flush 100% innodb_io_capacity dirty pages;

if(buffer_pool_modified_page_ratio_pct > innodb_max_dirty_page_pct)

goto suspend loop;

suspendloop迴圈偽**如下:

suspend loop:

suspend thread();

waiting event;

goto loop;

通過整理不難發現,整個master thread主要操作的物件只有,log buffer,insert buffer,dirty pages,undo pages,checkpoint。可以根據這些操作物件來分類主要有如下:

log buffer:

只在主迴圈中操作log buffer。而且,不管是在每一秒,還是每10秒,不需要任何前提,都會flush log buffer.這個最好理解。

insert buffer:

每一秒操作:如果一秒內磁碟io < 5% innodb_io_capacity,就至多合併5% innodb_io_capacity的insert buffer.否則就不操作。

每10秒操作:不需要任何前提,至多合併5% innodb_io_capacity的insert buffer。

background loop:至多合併100% innodb_io_capacity的insert buffer。

dirty pages:

每一秒操作:如果緩衝池髒頁比例 > innodb_max_dirty_pages_pct,就重新整理100%innodb_io_capacity的髒頁到磁碟。如果不滿足條件,但是滿足adaptive flush條件,仍會重新整理一定的髒頁到磁碟

每10秒操作:如果最近10秒內,磁碟io < innodb_io_capacity,就重新整理100%innodb_io_capacity的髒頁到磁碟。之後,如果緩衝池髒頁比例 > 70% ,再次重新整理100%innodb_io_capacity的髒頁到磁碟,否則重新整理10%innodb_io_capacity。

flush loop:只要緩衝池髒頁比例 > innodb_max_dirty_pages_pct,就重新整理100%innodb_io_capacity的髒頁到磁碟,直到髒頁比例小於innodb_max_dirty_pages_pct設定。

undo pages:

每10秒操作 :不需要任何前提,至多刪除20個undo 頁.

background loop : 不需要任何前提,至多刪除20個undo 頁.

checkpoint :

每10秒操作 :不需要任何前提,設定乙個模糊檢查點.

innodb的索引機制

1 innodb將資料和索引儲存在一起 2 innodb索引是基於b tree的clustered index,b tree中的每個結點儲存key row data innodb中的第二個索引儲存,在搜尋時,先通過key找到pk,再通過pk搜尋b tree的結點,從中找到row data 3 由於聚...

Innodb 鎖的介紹

innodb 與myisam 的最大不同有兩點 一是支援事務 transaction 二是採用了行級鎖。innodb 中的鎖是跟索引有關的,沒有索引就不給上鎖 recode gap next key locks 1 recode 是鎖住某一行記錄 2 gap lock會鎖住某一段範圍中的記錄 例子 ...

InnoDB 的表結構

innodb是索引組織表,這種結構的儲存是根據主鍵順序組織的。innodb要求每張表都必須有乙個主鍵,如果沒有innodb會自己確定或新增乙個主鍵 innodb的主鍵索引也稱為聚集索引,是乙個核心的索引,聚集索引採用b 樹結構,每個索引項都包含了row資料,也就是通過索引可以定義到具體的row資料,...