一、change buffer是什么?
change buffer是一種特殊的數(shù)據(jù)結(jié)構(gòu),當(dāng)二級(jí)索引頁(yè)不在buffer pool中時(shí),它將更改緩存到二級(jí)索引頁(yè)。緩沖的更改(可能由INSERT、UPDATE或DELETE操作(DML)引起)稍后在其他讀操作將頁(yè)面加載到緩沖池時(shí)合并。
二、change buffer工作過(guò)程?
官網(wǎng)介紹圖:

與聚簇索引不同的是,二級(jí)索引通常不是惟一的,并且二級(jí)索引的插入是以相對(duì)隨機(jī)的順序進(jìn)行的。類(lèi)似地,刪除和更新可能會(huì)影響索引樹(shù)中沒(méi)有鄰接位置的二級(jí)索引頁(yè)。稍后,當(dāng)其他操作將受影響的頁(yè)讀到緩沖池中時(shí),合并緩存的更改,可以避免從磁盤(pán)將次要索引頁(yè)讀到緩沖池中所需的大量隨機(jī)訪(fǎng)問(wèn)I/O。
purge操作會(huì)在系統(tǒng)大部分空閑或緩慢關(guān)閉期間定期將更新后的索引頁(yè)寫(xiě)入磁盤(pán)。與立即將每個(gè)值寫(xiě)入磁盤(pán)相比,purge操作可以更有效地將一系列索引值寫(xiě)入磁盤(pán)塊。
當(dāng)有許多受影響的行和許多次要索引需要更新時(shí),change buffer合并可能需要幾個(gè)小時(shí)。在此期間,磁盤(pán)I/O會(huì)增加,這可能導(dǎo)致磁盤(pán)綁定查詢(xún)的顯著減速。在事務(wù)提交后,甚至在服務(wù)器關(guān)閉和重啟后,更改緩沖區(qū)合并也可能繼續(xù)發(fā)生(更多信息請(qǐng)參見(jiàn)15.21.2節(jié)“強(qiáng)制InnoDB恢復(fù)”)。
在內(nèi)存中,change buffer占buffer pool的一部分。在磁盤(pán)上,change buffer是系統(tǒng)表空間的一部分,當(dāng)數(shù)據(jù)庫(kù)服務(wù)器關(guān)閉時(shí),將在其中緩沖索引更改。
change buffer中緩存的數(shù)據(jù)類(lèi)型由innodb_change_buffering變量控制。有關(guān)更多信息,請(qǐng)參見(jiàn)配置更改緩沖。您還可以配置最大更改緩沖區(qū)大小。有關(guān)更多信息,請(qǐng)參見(jiàn)配置更改緩沖區(qū)最大大小。
如果次要索引包含降序索引列,或者主鍵包含降序索引列,則不支持更改緩沖。
關(guān)于變更緩沖區(qū)的常見(jiàn)問(wèn)題,請(qǐng)參見(jiàn)A.16節(jié)“MySQL 8.0 FAQ: InnoDB變更緩沖區(qū)”
更多詳細(xì)信息請(qǐng)參考change buffer官網(wǎng)介紹地址
未完待續(xù)......