InnoDB Insert Buffer(插入緩衝)

InnoDB Insert Buffer(插入緩衝)數據庫

每一個存儲存儲引擎自身都有本身的特性(決定性能以及更高可靠性),而InnoDB的關鍵特性有:緩存

  • 插入緩衝(Insert Buffer)--》Change Buffer
  • 兩次寫(Double Write)
  • 自適應哈希索引(Adaptive Hash Page)
  • 異步IO(Async IO)
  • 刷新鄰接頁(Flush Neighbor Page)

今天主要聊一下插入緩衝(Insert Buffer)在InnoDB存儲引擎中的做用。異步

Insert Buffer實際上是一種重要的數據變動日誌,在MySQL5.1 以前稱爲Insert Buffer, 優化2級非惟一索引上插入操做的讀IO,在MySQL5.5以後更名爲Change Buffer, 功能也擴展爲2級非惟一索引上的插入、刪除、更新、purge的讀IO優化。也就是說Change buffer的主要目的是將對二級索引的數據操做緩存下來,以此減小二級索引的隨機IO,並達到操做合併的效果。值得提的一點是,Change Buffer也是物理頁的組成部分。性能

Change Buffer的核心思想,當數據庫須要對2級緩存進行修改時,是將這些更新緩存在內存中,在特定的條件下,統一將這些更新到相應的2級索引頁上,這樣作能夠減小讀IO的次數,而且相鄰的頁的讀IO能夠合併。之因此沒法對主鍵和惟一索引進行優化是由於惟一性判斷須要讀取實際索引頁面中的數據,這就和Insert Buffer 減小讀 IO 的初衷背離了。在源碼中的命名一直仍是用ibuf。
 
struct ibuf_struct{
  ulint size;  //當前ibuf btree 頁面數
  ulint max_size;  //ibuf最大頁面數
  ulint seg_size;  //所屬段的頁面數
  ibool empty;  //是否爲空
  ulint free_list_len;  //空閒鏈表長度
  ulint height;  //樹高度
  dict_index_t* index;  //ibuf索引
 
  ulint n_merges;  //合併的頁面數
  ulint n_merged_ops[IBUF_OP_COUNT];  //各類操做合併的頁面數
  ulint n_discarded_ops[IBUF_OP_COUNT]; //放棄的操做涉及的頁面數
};

從上述的結構體能夠得知,Ibuf實際上也是一棵B+樹索引,它與innodb中其餘的b+樹有着徹底同樣的結構。Ibuf樹中的記錄其實就是包含了記錄自己,還有記錄所在頁面號的信息。優化

  值得注意的點是,ibuf只適用於 non-unique secondary indexes 也就是說只能用在非惟一的索引上,緣由以下:spa

1. primary key 是按照遞增的順序進行插入的,異常插入聚族索引通常也順序的,非隨機IO線程

2. 寫惟一索引要檢查記錄是否是存在,因此在修改惟一索引以前,必須把修改的記錄相關的索引頁讀出來才知道是否是惟1、這樣ibuf就沒意義了,要讀出來(隨機IO)因此只對非惟一索引有意義。日誌

 

ibuf能夠對三種類型的操做進行緩存:INSERT、DELETE-MARK 、DELETE操做,前兩種對應用戶線程操做,第三種則由purge操做觸發。code

用戶能夠經過參數innodb_change_buffering來控制緩存何種操做:blog

static const char* innobase_change_buffering_values[IBUF_USE_COUNT] = {
        "none",         /* IBUF_USE_NONE */
        "inserts",      /* IBUF_USE_INSERT */
        "deletes",      /* IBUF_USE_DELETE_MARK */
        "changes",      /* IBUF_USE_INSERT_DELETE_MARK */
        "purges",       /* IBUF_USE_DELETE */
        "all"           /* IBUF_USE_ALL */
};

ibuf默認值爲all,表示緩存全部操做。注意因爲在二級索引上的更新操做老是先delete-mark,再insert新記錄,所以update會產生兩條ibuf entry。

所以delete buffer對應update操做的第一個過程,即將記錄標記爲刪除。purge buffer對應update操做的第二個過程,即將記錄真正的刪除。同時InnoDB存儲引擎提供了參數innodb_change_buffering,用來開啓各類buffer選項。該參數的可選值爲:inserts、deletes、purges、changes、all、none。inserts、deletes、purges就是前面討論過的三種狀況。changes表示啓用inserts和deletes,all表示啓用全部,none表示都不啓用。

相關文章
相關標籤/搜索