4 change buffer
4.1 基本概念
change buffer是一種特殊的數(shù)據(jù)結(jié)構(gòu),當(dāng)這些頁(yè)面不在緩沖池中時(shí),這些高速緩存會(huì)將更改緩存到輔助索引頁(yè)面。可能由INSERT,UPDATE或DELETE操作(DML)導(dǎo)致的緩沖更改將在以后通過(guò)其他的讀取操作將頁(yè)加載到緩沖池中時(shí)合并。
相關(guān)免費(fèi)學(xué)習(xí)推薦:mysql視頻教程
如上圖可見(jiàn),change buffer用的是buffer pool里的內(nèi)存,所以不能無(wú)限增長(zhǎng)。change buffer大小可通過(guò)參數(shù)innodb_change_buffer_max_size動(dòng)態(tài)設(shè)置。
比如設(shè)置為50:change buffer的大小最多只能占用buffer pool的50%。
需更新一個(gè)數(shù)據(jù)頁(yè)時(shí):
- 頁(yè)在內(nèi)存,直接更新
- 頁(yè)不在內(nèi)存,在不影響數(shù)據(jù)一致性下,InooDB會(huì)將這些更新操作緩存于change buffer,而無(wú)需從磁盤(pán)讀入頁(yè)
在下次查詢?cè)L問(wèn)該數(shù)據(jù)頁(yè)時(shí),才將數(shù)據(jù)頁(yè)讀入內(nèi)存,然后執(zhí)行change buffer中與這個(gè)頁(yè)有關(guān)的操作。通過(guò)該方式就能保證該數(shù)據(jù)邏輯的正確性。
change buffer 實(shí)際上也是可持久化的數(shù)據(jù),即它不僅在內(nèi)存中有拷貝,也會(huì)被寫(xiě)進(jìn)磁盤(pán)。
4.2 merge
將change buffer中的操作應(yīng)用到原數(shù)據(jù)頁(yè),得到最新結(jié)果的過(guò)程。
4.2.1 觸發(fā)時(shí)機(jī)
- 訪問(wèn)該數(shù)據(jù)頁(yè)
- 系統(tǒng)后臺(tái)線程定期merge
- 數(shù)據(jù)庫(kù)正常關(guān)閉(shutdown)的過(guò)程
若能將更新操作先記錄在change buffer,減少讀盤(pán),語(yǔ)句執(zhí)行速度便會(huì)明顯提升。且數(shù)據(jù)讀入內(nèi)存需要占用buffer pool,因此也能降低內(nèi)存占用,提高內(nèi)存利用率。
4.3 何時(shí)使用change buffer
- 對(duì)于唯一索引,更新操作都要先判斷該操作是否違反唯一性約束:
比如,要插入(4,400)記錄,要先判斷表中是否已存k=4記錄,就必須要將數(shù)據(jù)頁(yè)讀入內(nèi)存來(lái)判斷。若都已讀入內(nèi)存了,那直接更新內(nèi)存自然很快,沒(méi)必要使用change buffer。
因此,唯一索引的更新不能使用change buffer,只有普通索引可使用。
4.4 適用場(chǎng)景
難道普通索引的所有場(chǎng)景,使用change buffer都可加速嗎?
注意merge才是真正進(jìn)行數(shù)據(jù)更新時(shí)刻,change buffer主要是將記錄的變更動(dòng)作緩存。所以在一個(gè)數(shù)據(jù)頁(yè)做merge前,change buffer記錄變更越多(即該數(shù)據(jù)頁(yè)上要更新的次數(shù)越多),收益越大。
- 寫(xiě)多讀少業(yè)務(wù),頁(yè)面在寫(xiě)完后馬上被訪問(wèn)到的概率較小,change buffer使用效果最好。常見(jiàn)為賬單、日志類系統(tǒng)。
- 寫(xiě)后馬上查詢,將先新記錄在change buffer,但之后由于立即訪問(wèn)該數(shù)據(jù)頁(yè),又很快觸發(fā)merge,這樣的話隨機(jī)訪問(wèn)IO次數(shù)不會(huì)減少,反而增加change buffer維護(hù)代價(jià),change buffer起了副作用。