本文正在參加「Java主題月 - Java 開發實戰」,詳情查看 活動連接數據庫
change buffer是一種特殊的數據結構,當這些頁面不在緩衝池中時,這些高速緩存會將更改緩存到輔助索引頁面。可能由INSERT,UPDATE或DELETE操做(DML)致使的緩衝更改將在之後經過其餘的讀取操做將頁加載到緩衝池中時合併。 緩存
如上圖可見,change buffer用的是buffer pool裏的內存,因此不能無限增加。change buffer大小可經過參數innodb_change_buffer_max_size動態設置。 好比設置爲50:change buffer的大小最多隻能佔用buffer pool的50%。markdown
需更新一個數據頁時:數據結構
在下次查詢訪問該數據頁時,纔將數據頁讀入內存,而後執行change buffer中與這個頁有關的操做。經過該方式就能保證該數據邏輯的正確性。post
change buffer 實際上也是可持久化的數據,即它不只在內存中有拷貝,也會被寫進磁盤。spa
將change buffer中的操做應用到原數據頁,獲得最新結果的過程。線程
若能將更新操做先記錄在change buffer,減小讀盤,語句執行速度便會明顯提高。且數據讀入內存須要佔用buffer pool,所以也能下降內存佔用,提升內存利用率。日誌
好比,要插入(4,400)記錄,要先判斷表中是否已存k=4記錄,就必需要將數據頁讀入內存來判斷。若都已讀入內存了,那直接更新內存天然很快,不必使用change buffer。 所以,惟一索引的更新不能使用change buffer,只有普通索引可以使用。code
難道普通索引的全部場景,使用change buffer均可加速嗎?orm
注意merge纔是真正進行數據更新時刻,change buffer主要是將記錄的變動動做緩存。因此在一個數據頁作merge前,change buffer記錄變動越多(即該數據頁上要更新的次數越多),收益越大。