2. Change Buffer
寫請(qǐng)求的處理流程
(1)如果索引頁(yè)不在buffer pool中, 則先把索引頁(yè),從磁盤加載到緩沖池闸英,一次磁盤隨機(jī)讀操作;
(2)修改緩沖池中的頁(yè),一次內(nèi)存操作纫谅;
(3)寫入redo log,一次磁盤順序?qū)懖僮鳎?/p>
寫請(qǐng)求處理
是否會(huì)出現(xiàn)一致性問(wèn)題呢溅固?
不會(huì), 因?yàn)?
(1)讀取付秕,會(huì)命中緩沖池的頁(yè);
(2)緩沖池LRU數(shù)據(jù)淘汰侍郭,會(huì)將“臟頁(yè)”刷回磁盤询吴;
(3)數(shù)據(jù)庫(kù)異常奔潰,能夠從redo log中恢復(fù)數(shù)據(jù)亮元;
利用Change Buffer進(jìn)行優(yōu)化
上述場(chǎng)景中, 被讀取的數(shù)據(jù)沒(méi)有命中緩沖池的時(shí)候猛计,會(huì)先從磁盤索引頁(yè)到緩沖池中, 這樣至少產(chǎn)生一次磁盤IO,對(duì)于寫多讀少的業(yè)務(wù)場(chǎng)景爆捞,性能壓力會(huì)劇增, 于是InnoDB引入了Change Buffer:
- 當(dāng)對(duì)頁(yè)進(jìn)行了寫操作有滑,并不會(huì)立刻將磁盤頁(yè)加載到緩沖池
- 先把頁(yè)的寫操作記錄到緩沖變更池(buffer changes)
- 等未來(lái)數(shù)據(jù)被讀取時(shí),再將數(shù)據(jù)合并(merge)恢復(fù)到緩沖池中
寫緩沖的目的是降低寫操作的磁盤IO嵌削,提升數(shù)據(jù)庫(kù)性能毛好。
Change Buffer在內(nèi)存中,Change Buffer占用Buffer Pool的一部分苛秕。在磁盤上肌访,Change Buffer是系統(tǒng)表空間的一部分,其中的索引會(huì)在關(guān)閉數(shù)據(jù)庫(kù)服務(wù)器時(shí)更改艇劫。
Change Buffer相關(guān)參數(shù)配置
- 配置Change Pool最大大小
---innodb_change_buffer_max_size: 允許將Change Buffer的最大大小配置為緩沖池總大小的百分比吼驶。默認(rèn)情況下, innodb_change_buffer_max_size設(shè)置為25.最大設(shè)置為50。- 配置Change Buffer的適用范圍
---innodb_change_buffering: all | none | inserts | deletes | changes | purges