淺談 MySQL InnoDB 存儲引擎

jopen 12年前發布 | 11K 次閱讀 MySQL 數據庫服務器

InnoDB是事務安全的存儲引擎,設計上借鑒了很多Oracle的架構思想,一般而言,在OLTP應用中,InnoDB應該作為核心應用表的首先存儲引擎。InnoDB是由第三方的Innobase Oy公司開發,現已被Oracle收購,創始人是Heikki Tuuri,芬蘭赫爾辛基人,和著名的Linux創始人Linus是校友。

 

InnoDB體系架構

d1.jpeg
上面是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),如下圖所示:

d2.jpeg


其中緩沖池占最大塊內存,用來緩存各自數據,數據文件按頁(每頁16K)讀取到緩沖池,按最近最少使用算法(LRU)保留緩存數據。
緩沖池緩沖的數據類型有:數據頁、索引頁、插入緩沖、自適應哈希索引、鎖信息、數據字典信息等,其中數據頁和索引頁占了絕大部分內存。

日志緩沖將重做日志信息先放入這個緩沖區,然后按一定頻率(默認為1s)將其刷新至重做日志文件。

Master 后臺線程

InnoDB的主要工作都是在一個單獨的Master線程里完成的。Master線程的優先級最高,它主要分為以下幾個循環:主循環(loop)、后臺循環(background loop)、刷新循環(flush loop)、暫停循環(suspend loop)。

先來看看主循環,下面是它的偽代碼:
  1. void master_thread() (  
  2. loop:  
  3. for (int i =0; i <10; i++){  
  4.     do thing once per second  
  5.     sleep 1 second if necessary  
  6. }  
  7. do things once per ten seconds  
  8. goto loop;  
  9. }  

其中每秒一次的操作包括:
  • 刷新日志緩沖區(總是)
  • 合并插入緩沖(可能)
  • 至多刷新100個臟數據頁(可能)
  • 如果沒有當前用戶活動,切換至background loop (可能)
和Oracle類似,即使事務未提交,也會每秒刷新重做日志緩沖區。

其中每10秒一次的操作包括:
  • 合并至多5個插入緩沖(總是)
  • 刷新日志緩沖(總是)
  • 刷新100個或10個臟頁到磁盤(總是)
  • 產生一個檢查點(總是)
  • 刪除無用Undo 頁 (總是)

接著來看后臺循環,若當前沒有用戶活動或數據庫關閉時,會切換至該循環執行以下操作:
  • 刪除無用的undo頁(總是)
  • 合并20個插入緩沖(總是)
  • 跳回到主循環(總是)
  • 不斷刷新100個頁,直到符合條件跳轉到flush loop(可能)
如果flush loop中也沒有什么事情可做,邊切換到suspend loop,將master線程掛起。
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!