淺談 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)。
先來看看主循環,下面是它的偽代碼:
- 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線程掛起。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!