MySql(一) InnoDB存儲引擎

一.InnoDB體系架構

InnoDB的總體結構主要由三部分組成:負責各個功能的線程,介於線程與磁盤間的內存緩衝(用於提高數據庫允許速度),存於磁盤的文件。

   

 

二.MySql後臺線程

2.1 MasterThread

MasterThread是核心線程,具有最高線程優先級,主要負責數據異步刷新到磁盤,包括:髒頁的刷新、插入緩衝的合併、UNDO頁的回收。MasterThread線程中有四種內部循環,分別爲:主循環loop、後臺循環backgroup loop、刷新循環flush loop、暫停循環suspend loop。每種循環分別在不同情況下運轉,負責執行不同的任務。

【注】:undo頁用於存放修改數據時被修改前的數據。對錶進行Update、Deleta等操作時,由於一致性讀的原因,需要保存這些行各個版本的信息在undo頁中。

2.1.1)主循環 loop

該循環的主要任務是:髒頁刷新、日誌緩衝刷新、無用undo頁的刪除、插入緩衝的合併至輔助索引頁。循環會每秒和每10秒依據情況進行以上操作。

每秒操作如下:

  • 將重做日誌緩衝刷新到磁盤,即使該事務還未提交。(總是)
  • 刷新innodb_io_capacity(默認值爲200)個髒頁至磁盤。(緩衝池中髒頁比例超過了配置文件中的innodb_max_dirty_pages_pct)
  • 合併Insert Buffer至輔助索引頁。(前一秒的IO次數小於5次)
  • 若當前沒有用戶活動,則切換到backgroup loop。

每10秒操作如下:

  • 根據IO決定是否刷新一定數量的髒頁至磁盤。(前10秒的IO次數小於200)
  • 合併一些Insert Buffer至輔助索引頁。(總是)
  • 將重做日誌緩衝刷新到磁盤。(總是)
  • 刪除無用的Undo頁。(總是,自InnoDB1.1版本開始,undo頁回收操作交由PurgeThread線程處理,)
  • 根據髒頁佔比決定刷新多少髒頁至磁盤中。(髒頁比例超過buf_get_modified_radio_pct則刷新100個,否則刷新10個)

 

2.1.2)後臺循環 background loop

當沒有用戶活動(數據庫空閒)時或數據庫關閉(shutdown),便會切換到該循環。該循環主要執行以下操作:

  • 刪除無用的Undo頁。(總是)
  • 合併Insert Buffer至輔助索引頁。(總是)
  • 跳回主循環(總數)
  • 跳轉至flush loop中刷新100個頁,直至符合條件。

2.1.3)刷新循環 flush loop

刷新一定數量的髒頁到磁盤中。

2.1.4)暫停循環 suspend loop

將MasterThread掛起,等待時間發生。

 

三.內存緩衝

3.1 緩衝池

爲了平衡CPU的處理速度與磁盤讀寫速度間的不匹配,mySql會將磁盤上的物理頁讀取到內存中,以此提高數據庫的整體性能。自InnoDB1.0.x起,mySql允許創建多個緩衝池實例,這增加了數據庫的併發處理能力。

3.1.1)數據頁緩衝的管理

數據頁緩衝用於存放那些存儲數據的物理頁,mySql通過三種鏈表來管理這些內存。

(1)LRU List

LRU(Latest Recent Used 最近最少使用) List用於管理那些最近讀取的頁。那些最頻繁使用的頁在LRU List的前端,最少使用的頁在LRU List的尾端。爲了防止由於索引和數據掃描操作時讀入大量頁,導致的熱點數據頁被移除,mySql對傳統LRU算法進行了改進。

在傳統LRU鏈表上,增加了一個midPoint點,該點所在位置由參數innodb_old_blocks_pct控制。對於新讀取的頁將被現添加到鏈表的midPoint位置,並在參數innodb_old_blocks_times指定的時間後,加入到LRU的熱點列表(即LRU鏈表midPoint之前的位置)。

(2)Free List

Free List用於管理空閒頁。

(3)Flush List

用於管理髒頁,因此也稱爲髒頁列表。

3.2 重做日誌緩衝

InnoDB存儲引擎將重做日誌信息先寫入重做日誌緩存中,之後再以一定頻率刷新至重做日誌文件(重做日誌的內容應該類似於Redis的AOF文件)。重做日誌文件是循環使用的,而非無限增大,可以被循環利用的部分是指當數據庫發生宕機需要恢復時,不需要的那部分日誌。

【注】:Innodb通過日誌序列號LSN(Log Sequence Number)來完成日誌的循環利用,LSN記錄了寫入日誌的字節總量,在日誌文件、CheckPoint和頁都有LSN的記錄指。通過刷新回磁盤的最新頁LSN和已經寫入日誌的LSN,可以知道日誌文件哪一部分是有用的

3.2.1)CheckPoint技術

 

3.3 插入緩衝

數據庫中的非聚集索引是使用B+樹實現的,這就導致了在非聚集索引中進行索引插入時,會離散訪問索引頁。但輔助索引在邏輯上是順序的,因此其插入也是比較順序的(比如已時間字段爲索引)。

爲了解決離散訪問帶來的效率問題,InnoDB引入了插入緩衝,對於非聚集索引的插入或更新操作,不是每一次都直接插入到索引頁中,而是先判斷索引頁是否在內存緩衝中,若在則直接插入,否則先放入插入緩衝。之後再以一定頻率進行插入緩衝與輔助索引頁子節點的合併。這樣往往可以將多次操作合併到一次對物理頁的訪問中去。

【注】:InnoDB從1.0.x版本開始引入了Change Buffer。該緩衝會用於緩存DML操作——INSERT、DELETE、UPDATE操作進行緩衝。ChangeBuffer適用的對象依然是非唯一輔助索引。

3.3.1)Insert Buffer的內部實現

B+樹

 

四.效率與可靠性的其它措施

4.1 兩次寫(DoubleWrite)

 

4.2 自適應哈希索引(AHI)

 

4.3 刷新鄰接頁

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章