2. Change Buffer
寫請求的處理流程
(1)如果索引頁不在buffer pool中, 則先把索引頁,從磁盤加載到緩沖池,一次磁盤隨機讀操作;
(2)修改緩沖池中的頁,一次內存操作;
(3)寫入redo log,一次磁盤順序寫操作;
寫請求處理
是否會出現一致性問題呢?
不會, 因為:
(1)讀取,會命中緩沖池的頁;
(2)緩沖池LRU數據淘汰,會將“臟頁”刷回磁盤;
(3)數據庫異常奔潰,能夠從redo log中恢復數據;
利用Change Buffer進行優(yōu)化
上述場景中, 被讀取的數據沒有命中緩沖池的時候,會先從磁盤索引頁到緩沖池中, 這樣至少產生一次磁盤IO,對于寫多讀少的業(yè)務場景,性能壓力會劇增, 于是InnoDB引入了Change Buffer:
- 當對頁進行了寫操作,并不會立刻將磁盤頁加載到緩沖池
- 先把頁的寫操作記錄到緩沖變更池(buffer changes)
- 等未來數據被讀取時,再將數據合并(merge)恢復到緩沖池中
寫緩沖的目的是降低寫操作的磁盤IO,提升數據庫性能。
Change Buffer在內存中,Change Buffer占用Buffer Pool的一部分。在磁盤上,Change Buffer是系統(tǒng)表空間的一部分,其中的索引會在關閉數據庫服務器時更改。
Change Buffer相關參數配置
- 配置Change Pool最大大小
---innodb_change_buffer_max_size: 允許將Change Buffer的最大大小配置為緩沖池總大小的百分比。默認情況下, innodb_change_buffer_max_size設置為25.最大設置為50。- 配置Change Buffer的適用范圍
---innodb_change_buffering: all | none | inserts | deletes | changes | purges

