[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線程掛起。