【MySQL(四)】change buffer機制

change buffer是針對數據庫的更新語句做的一種優化。之前介紹過,wal機制是一種更新語句的優化,可以將磁盤隨機寫轉變爲磁盤順序寫。那麼change buffer 又是如何優化的呢?

個人理解:wal是使用了redo log,在磁盤級別緩存了更新操作,磁盤隨機寫->磁盤順序寫;change buffer是使用了內存buffer,在內存級別又緩存了一次更新操作,降低了磁盤隨機讀的次數。

詳細看下:

對於一次更新操作,innodb引擎會看更新的頁是否在buffer pool中,如果在,那麼直接更新buffer pool,並且寫入一條redo log。這樣後續的讀取操作可以讀到最新的值。如果不在,那麼就先將本次更新操作記錄到change buffer中,而不是立刻取更新,最後再記錄一條redo log。如果後面有讀操作,那麼再將對應的數據頁載入到buffer pool中,同時將change pool中的更新操作應用到該數據頁,這個過程叫做merge。當然如果系統是空閒狀態,也會有後臺線程去做merge過程。

可以看到,innodb對於更新操作的優化原則就是使用緩存手段,儘量延後更新操作。當然這個思路僅適用於寫多讀少的場景,比如日誌系統。因爲如果寫完數據後立刻要讀,那麼沒有必要額外維護change buffer的緩存了。

還有一點,change buffer僅用於更新普通索引,對唯一性索引無效,因爲唯一性索引肯定要讀數據頁做唯一性判斷的。

相關參數:

innodb_change_buffer_max_size:changebuffer緩存佔整個緩存的比例;

innodb_change_buffering:哪些更新操作可以使用changebuffer;

參考:https://juejin.im/post/5d1357b8f265da1b961314c0

小結:

1、wal,優化磁盤寫性能;

2、change buffer,減少磁盤讀次數;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章