一测秸、change buffer是什么?
change buffer是一種特殊的數(shù)據(jù)結(jié)構(gòu),當(dāng)二級索引頁
不在buffer pool
中時灾常,它將更改緩存到二級索引頁霎冯。緩沖的更改(可能由INSERT
、UPDATE
或DELETE
操作(DML)引起)稍后在其他讀操作將頁面加載到緩沖池時合并钞瀑。
二沈撞、change buffer工作過程?
官網(wǎng)介紹圖:
與聚簇索引
不同的是,二級索引通常不是惟一
的仔戈,并且二級索引的插入是以相對隨機(jī)的順序進(jìn)行的关串。類似地拧廊,刪除和更新可能會影響索引樹中沒有鄰接位置的二級索引頁监徘。稍后,當(dāng)其他操作將受影響的頁讀到緩沖池中時吧碾,合并緩存
的更改凰盔,可以避免從磁盤將次要索引頁讀到緩沖池中所需的大量隨機(jī)訪問I/O。
purge
操作會在系統(tǒng)大部分空閑或緩慢關(guān)閉期間定期將更新后的索引頁寫入磁盤倦春。與立即將每個值寫入磁盤相比户敬,purge
操作可以更有效地將一系列索引值寫入磁盤塊。
當(dāng)有許多受影響的行和許多次要索引需要更新時睁本,change buffer
合并可能需要幾個小時尿庐。在此期間,磁盤I/O會增加呢堰,這可能導(dǎo)致磁盤綁定查詢的顯著減速抄瑟。在事務(wù)提交后,甚至在服務(wù)器關(guān)閉和重啟后枉疼,更改緩沖區(qū)合并也可能繼續(xù)發(fā)生(更多信息請參見15.21.2節(jié)“強(qiáng)制InnoDB恢復(fù)”)皮假。
在內(nèi)存中鞋拟,change buffer
占buffer pool
的一部分。在磁盤上,change buffer
是系統(tǒng)表空間
的一部分惹资,當(dāng)數(shù)據(jù)庫服務(wù)器關(guān)閉時贺纲,將在其中緩沖索引更改。
change buffer
中緩存的數(shù)據(jù)類型由innodb_change_buffering
變量控制褪测。有關(guān)更多信息猴誊,請參見配置更改緩沖。您還可以配置最大更改緩沖區(qū)大小侮措。有關(guān)更多信息稠肘,請參見配置更改緩沖區(qū)最大大小。
如果次要索引包含降序索引列萝毛,或者主鍵包含降序索引列项阴,則不支持更改緩沖。
關(guān)于變更緩沖區(qū)的常見問題笆包,請參見A.16節(jié)“MySQL 8.0 FAQ: InnoDB變更緩沖區(qū)”
更多詳細(xì)信息請參考change buffer官網(wǎng)介紹地址
未完待續(xù)......