在進行數據插入時,須要將數據插入到彙集索引和非彙集索引中,而對於非彙集索引,須要先肯定數據要插入的索引頁,再將索引頁加載到內存中進行修改,而在業務上很難保證插入數據在非彙集索引上也是連續的,所以插入操做會引入大量隨機IO操做。緩存
Innodb存儲引擎引入Insert Buffer Pool特性來對插入操做進行優化,在INSERT操做是,對非惟一索引的更新沒有實時更新,而是將更新操做進行緩存,在必定條件下再觸發操做將更新操做應用到索引上。
操做原理:
插入數據時判斷索引頁是否存於內存中:
一、索引頁存在於內存中,直接更新索引頁
二、索引頁不存在於內存中,且知足將更新操做放入Insert Buffer Pool操做條件,將更新操做信息和索引頁信息放入到Insert Buffer Pool中。異步
雖然"更新操做"能夠被暫時緩存到Insert Buffer Pool中,但最終仍是須要將"更新操做"應用到索引頁上,即Merge操做,Merge操做根據觸發方式分爲兩種:
一、主動Merge,由Innodb主線程按期後臺進行,採用異步IO進行操做讀取索引頁面,而後進行merge。
A) 對於每秒執行一次主線程,若是過去1s以內發生的I/O小於系統I/O能力的5%,則觸發一次Merge操做,merge的頁面數爲系統I/O能力的5%
B) 對於每10秒執行一次得主線程,一定觸發一次merge操做,merge的頁面數爲系統I/O能力的5%性能
二、被動Merge,由用戶操做觸發:
A) Insert操做致使目標索引頁的空間不足,須要進行頁拆分操做,Insert Buffer只能處理單個頁面,不能緩存須要拆分的索引頁。
B) 當前Insert Buffer太大,須要強制進行merge操做。
C) 因爲特殊緣由,將"更新操做"放入Insert Buffer時出錯,須要將"更新操做"直接應用到索引頁上。
D) 用戶操做需訪問索引頁,將索引頁從磁盤中加載到內存,將Inser Buffer中緩存的"更新操做"進行merge。優化
##====================================================##
Insert Buffer優勢:
一、在INSERT操做能快速返回,提升插入效率
二、在進行Merge時,能夠將多個連續的頁面一次讀取到內存中進行merge,減小隨機IO帶來的性能損耗,將隨機IO轉換爲順序IO線程
##====================================================##
Insert Buffer的相關知識點
一、Innodb存儲引擎使用Insert Buffer Bitmap來跟蹤每一個非彙集索引頁的使用狀況,從而推斷出是否會發生頁拆分的狀況。
二、非彙集惟一索引沒法使用Insert Buffer,由於須要在插入時須要讀取索引頁來肯定插入數據是否惟一。
三、在MySQL 5.5中,對Insert Buffer進行加強,引入Change Buffer特性,能對INSERT/DELETE/UPDATE操做的修改信息進行緩存。
##====================================================##3d