MySQL的change buffer是啥?|Java 開發實戰

本文正在參加「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

需更新一個數據頁時:數據結構

  • 頁在內存,直接更新
  • 頁不在內存,在不影響數據一致性下,InooDB會將這些更新操做緩存於change buffer,而無需從磁盤讀入頁

在下次查詢訪問該數據頁時,纔將數據頁讀入內存,而後執行change buffer中與這個頁有關的操做。經過該方式就能保證該數據邏輯的正確性。post

change buffer 實際上也是可持久化的數據,即它不只在內存中有拷貝,也會被寫進磁盤。spa

merge

將change buffer中的操做應用到原數據頁,獲得最新結果的過程。線程

觸發時機

  1. 訪問該數據頁
  2. 系統後臺線程按期merge
  3. 數據庫正常關閉(shutdown)的過程

若能將更新操做先記錄在change buffer,減小讀盤,語句執行速度便會明顯提高。且數據讀入內存須要佔用buffer pool,所以也能下降內存佔用,提升內存利用率。日誌

什麼時候使用change buffer

  • 對於惟一索引,更新操做都要先判斷該操做是否違反惟一性約束:

好比,要插入(4,400)記錄,要先判斷表中是否已存k=4記錄,就必需要將數據頁讀入內存來判斷。若都已讀入內存了,那直接更新內存天然很快,不必使用change buffer。 所以,惟一索引的更新不能使用change buffer,只有普通索引可以使用code

適用場景

難道普通索引的全部場景,使用change buffer均可加速嗎?orm

注意merge纔是真正進行數據更新時刻,change buffer主要是將記錄的變動動做緩存。因此在一個數據頁作merge前,change buffer記錄變動越多(即該數據頁上要更新的次數越多),收益越大。

  • 寫多讀少業務,頁面在寫完後立刻被訪問到的機率較小,change buffer使用效果最好。常見爲帳單、日誌類系統。
  • 寫後立刻查詢,將先新記錄在change buffer,但以後因爲當即訪問該數據頁,又很快觸發merge,這樣的話隨機訪問IO次數不會減小,反而增長change buffer維護代價,change buffer起了反作用。
相關文章
相關標籤/搜索