您當前的位置:首頁 > 曲藝

MySQL——InnoDB體系結構

作者:由 孑辭 發表于 曲藝時間:2020-02-06

InnoDB是當今最流行的MySQL儲存引擎,瞭解它的體系結構尤其有助於我們理解MySQL是如何進行redo和undo的,如何實現MVCC的等等。

關鍵詞

後臺執行緒

Master Thread

IO Thread

Purge Thread

緩衝池

緩衝池儲存內容

緩衝池管理

重做日誌緩衝

額外的記憶體池

Checkpoint檢查點技術

InnoDB關鍵特性

插入緩衝 Insert Buffer

儲存

原理

使用條件

內部實現

Insert Buffer的merge時機

兩次寫 Double Write

解決的核心問題

原理

自適應雜湊索引 Adaptive Hash Index

原理

條件

非同步IO AIO

重新整理鄰接頁 Flush Neighbor Page

MySQL——InnoDB體系結構

InnoDB體系結構

1.後臺執行緒

1.1Master Thread

核心後臺執行緒,負責將緩衝池資料非同步重新整理到磁碟,保證資料一致性。

1.2IO Thread

InnoDB儲存引擎中大量使用了AIO(Async IO)來處理寫IO請求,這樣可以極大提高資料庫效能。IO Thread主要負責這些IO請求的回撥。

1.3Purge Thread

事務被提交後,其所使用的undo log可能不再需要。因此需要Purge Thread來回收已經使用並分配的undo頁。

2.緩衝池

2.1緩衝池儲存內容

快取的資料頁型別有:索引頁、資料頁、undo頁、插入緩衝、自適應雜湊索引、鎖資訊、資料字典資訊等。

InnoDB可以有多個緩衝池例項,每個頁根據雜湊值平均分配到不同緩衝池例項中。

2.2緩衝池管理

InnoDB利用類似LRU演算法對緩衝池進行管理,在傳統LRU上做了一些最佳化,新進的頁不在頭部而是在midpoint位置(5/8處),以防在大的SQL掃描操作時把熱點資料全刷下去。在midpoint的頁過一定時間後就會加入到LRU列表的熱端,時間由引數指定。

2.3重做日誌緩衝

InnoDB先將重做日誌資訊放到這個緩衝區,然後按一定頻率重新整理到重做日誌檔案。

一般每秒都會將緩衝重新整理到日誌,所以重做日誌緩衝不需要很大。

2.4額外的記憶體池

每個緩衝池中的幀緩衝(frame buffer)以及對應的緩衝控制物件,它們的記憶體需要從額外記憶體池中獲取。

2.5Checkpoint檢查點技術

該技術的目的是解決以下幾個問題:

縮短資料庫恢復時間

緩衝池不夠用時,將髒頁重新整理回磁碟

重做日誌不可用時,重新整理髒頁

當資料庫發生宕機時,資料庫不需要重做所有的日誌,因為Checkpoint之前的頁都已經重新整理回磁碟。故資料庫只要對Checkpoint後的重做日誌進行恢復。

3.InnoDB關鍵特性

3.1插入緩衝 Insert Buffer

3.1.1儲存

Insert Buffer和資料頁一樣,也是

物理頁

的一個組成部分。

不僅是INSERT,也有Delete Buffer、Purge Buffer(UPDATE)

3.1.2原理

對於非聚集索引的插入或更新,不是每一次直接插入到索引頁,而是先判斷插入的非聚集索引頁是否在緩衝池中,若在則直接插入;若不在,則先放入到一個Insert Buffer中。

然後再以一定的頻率進行Insert Buffer和輔助索引頁的merge操作。這時通常能將多個插入合併到一個操作中(因為在一個索引頁中),這就大大提高了插入非聚集索引的效能。

3.1.3使用條件

Insert Buffer的使用需要滿足兩個條件:

索引是非聚集索引secondary index

索引不是唯一索引(不需要檢查重複)

3.1.4內部實現

Insert Buffer是一棵B+樹(全域性只有一棵)

3.1.5Insert Buffer的merge時機

可能發生在以下幾種情況下:

非聚集索引頁被讀取到緩衝池

輔助索引頁已沒有可用空間

Master Thread觸發

3.2兩次寫 Double Write

如果說Insert Buffer帶來的是效能提升,Double Write帶來的就是資料頁的可靠性。

3.2.1解決的核心問題

部分寫失效 partial page write

問題。

資料庫宕機時,InnoDB正在寫入某個頁到表中,而這個頁只寫了一部分。

對於這個問題,透過重做日誌恢復可能是沒有用的(頁已經發生損壞)。

3.2.2原理

MySQL——InnoDB體系結構

3.3自適應雜湊索引 Adaptive Hash Index

3.3.1原理

InnoDB會監控對錶上各索引頁的查詢,如果觀察到建立雜湊索引可以帶來速度提升,則建立雜湊索引。

根據訪問的

頻率

模式

來自動地為某些熱點頁建立雜湊索引。

3.3.2條件

對這個頁的連續訪問模式必須是一樣的,不能交替。

訪問達到一定次數(資料訪問100次,且頁訪問了N次(N=頁中記錄/16))

3.4非同步IO AIO

使用者可以在發出一個IO請求後立即再發出一個IO請求,最後等待所有IO完成

可以進行IO merge,把多個IO合併為一個IO

3.5重新整理鄰接頁 Flush Neighbor Page

重新整理一個髒頁時,InnoDB會檢測該頁所在區(extent)的所有頁,如果是髒頁就一起重新整理。

標簽: 緩衝  索引  io  buffer  InnoDB