[MySQL]淺談InnoDB存儲引擎
InnoDB是事務安全的存儲引擎,設計上借鑒了很多Oracle的架構思想,一般而言,在OLTP應用中,InnoDB應該作為核心應用表的首先存儲引擎。InnoDB是由第三方的Innobase Oy公司開發,現已被Oracle收購,創始人是Heikki Tuuri,芬蘭赫爾辛基人,和著名的Linux創始人Linus是校友。
InnoDB體系架構
上面是InnoDB的一個簡圖,簡單來說,InnoDB是由一系列後台線程和一大塊內存組成。
後台線程
默認情況下,InnoDB的後台線程有7個 —— 4個IO thread, 1個master thread, 1個lock monitor thread, 一個error monitor thread
內存
InnoDB的內存主要有以下幾個部分組成:緩沖池 (buffer pool)、重做日志緩沖池(redo log buffer)以及額外的內存池(additional memory pool),如下圖所示:
其中緩沖池占最大塊內存,用來緩存各自數據,數據文件按頁(每頁16K)讀取到緩沖池,按最近最少使用算法(LRU)保留緩存數據。
緩沖池緩沖的數據類型有:數據頁、索引頁、插入緩沖、自適應哈希索引、鎖信息、數據字典信息等,其中數據頁和索引頁占了絕大部分內存。
日志緩沖將重做日志信息先放入這個緩沖區,然後按一定頻率(默認為1s)將其刷新至重做日志文件。
Master 後台線程
InnoDB的主要工作都是在一個單獨的Master線程裡完成的。Master線程的優先級最高,它主要分為以下幾個循環:主循環(loop)、後台循環(background loop)、刷新循環(flush loop)、暫停循環(suspend loop)。
先來看看主循環,下面是它的偽代碼:
[plain]
void master_thread() (
loop:
for (int i =0; i <10; i++){
do thing once per second
sleep 1 second if necessary
}
do things once per ten seconds
goto loop;
}
其中每秒一次的操作包括:
刷新日志緩沖區(總是)
合並插入緩沖(可能)
至多刷新100個髒數據頁(可能)
如果沒有當前用戶活動,切換至background loop (可能)
和Oracle類似,即使事務未提交,也會每秒刷新重做日志緩沖區。
其中每10秒一次的操作包括:
合並至多5個插入緩沖(總是)
刷新日志緩沖(總是)
刷新100個或10個髒頁到磁盤(總是)
產生一個檢查點(總是)
刪除無用Undo 頁 (總是)
接著來看後台循環,若當前沒有用戶活動或數據庫關閉時,會切換至該循環執行以下操作:
刪除無用的undo頁(總是)
合並20個插入緩沖(總是)
跳回到主循環(總是)
不斷刷新100個頁,直到符合條件跳轉到flush loop(可能)
如果flush loop中也沒有什麼事情可做,邊切換到suspend loop,將master線程掛起。