小編給大家分享一下怎么配置Change Buffer,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)會同,10余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575Change Buffer是一種特殊的數(shù)據(jù)結(jié)構(gòu),緩存對二級索引頁面的更改并且這些頁面不在Buffer Pool中。緩存的changes可能由 Insert 、Delete 和 Update的結(jié)果導(dǎo)致。稍后在頁面被其他讀取操作加載到Buffer Pool的時候合并。
簡而言之:Change buffer的主要目的是將對二級索引的數(shù)據(jù)操作緩存下來,以此減少二級索引的隨機(jī)IO,并達(dá)到操作合并的效果。
與聚簇索引(ps:默認(rèn)是InnoDB里的主鍵,主鍵是聚集存儲的)不同,二級索引通常不是的,并且插入二級索引的順序相對隨機(jī)。刪除和更新可能會影響不在索引樹中相鄰的二級索引頁。當(dāng)受影響的頁面被其他操作讀入緩沖池時,合并緩存的更改,避免了從磁盤讀取二級索引頁到緩沖池所需的大量隨機(jī)訪問I / O。
在MySQL5.5之前的版本中,由于只支持緩存insert操作,所以最初叫做insert buffer,只是后來的版本中支持了更多的操作類型緩存,才改叫change buffer,所以本文是基于MySQL5.5之后的版本。
(Secondary Index(二級索引)
1、也可以稱為 非聚集索引
2、葉子節(jié)點存儲的是索引和主鍵信息
3、在找到索引后,得到對應(yīng)的主鍵,再回到聚集索引 中找主鍵對應(yīng)的記錄(row data))
放出二級索引的解釋可能還是懵,什么時候算作二級索引,所有主鍵以外的索引都是二級索引(innodb默認(rèn))。
所以說根據(jù)主鍵訪問數(shù)據(jù)(永遠(yuǎn)是效果好的方式),原因看上方括號內(nèi)二級索引介紹
為何需要Change Buffer
表的索引存于該表的ibd文件中,數(shù)據(jù)也存于此文件。表數(shù)據(jù)更新的同時也會更新對應(yīng)的表的索引數(shù)據(jù),所以:例如對表進(jìn)行insert時,很可能會產(chǎn)生大量的物理讀(物理讀索引數(shù)據(jù)頁),insert一個表,對應(yīng)的表上面的索引會變動,索引不常使用,產(chǎn)生物理讀,索引順序和表不一致耗時。
(物理讀(Physical Reads):從磁盤讀取數(shù)據(jù)塊到內(nèi)存的操作叫物理讀,當(dāng)緩存不存在這些數(shù)據(jù)塊的時候就會產(chǎn)生物理讀,物理讀過大表現(xiàn)為磁盤 I/O 較高)
所以將對索引的更新記錄存入Change Buffer中,而不是直接調(diào)入索引頁進(jìn)行更新;選擇時機(jī)進(jìn)行merge insert buffer的操作,將insert buffer中的記錄合并(merge)到真正的輔助索引中。
系統(tǒng)大部分空閑時或在慢速關(guān)閉期間運行的清除(purge)操作會定期將更新的索引頁寫入磁盤。與每個值立即寫入磁盤相比,purge操作可以更有效地為一系列索引值寫入磁盤塊。
當(dāng)有許多受影響的行和許多要更新的二級索引時,Change Buffer合并可能需要幾個小時。在此期間,磁盤I / O會增加,這會導(dǎo)致磁盤綁定查詢顯著減慢。在提交事務(wù)之后,甚至在服務(wù)器關(guān)閉并重新啟動之后,更改緩沖區(qū)合并也可能繼續(xù)發(fā)生
在內(nèi)存中,Change Buffer占用Buffer Pool的一部分。在磁盤上,Change Buffer是系統(tǒng)表空間的一部分,其中的索引會在關(guān)閉數(shù)據(jù)庫服務(wù)器時更改。
配置Change Buffer
對表執(zhí)行 INSERT,UPDATE和 DELETE操作時, 索引列的值(尤其是secondary keys的值)通常按未排序順序排列,需要大量I / O才能使二級索引更新。Change Buffer會緩存這個更新當(dāng)相關(guān)頁面不在Buffer Pool中,從而磁盤上的相關(guān)頁面不會立即被讀避免了昂貴的I / O操作。當(dāng)頁面加載到緩沖池中時,將合并緩沖的更改,稍后將更新的頁面刷新到磁盤。該InnoDB主線程在服務(wù)器幾乎空閑時以及在慢速關(guān)閉期間合并緩沖的更改 。
為方便理解:來了一個關(guān)于二級索引頁面的DML操作,并且這個頁面沒有在Buffer Pool內(nèi),那么把這個操作存入Change Buffer(MySQL5.5之前的版本叫Insert Buffer),ok,那么下一次需要加載這個頁面的時候,也就是這個頁面有需求的時候,會將Change Buffer內(nèi)的更改合并到Buffer Pool,隨后當(dāng)服務(wù)器在空閑的時候,這個更改會刷到disk(磁盤)上。所以一開始那張很難讀的圖的流程就清晰了:(黃色箭頭這樣的走勢)
因為它可以減少磁盤讀取和寫入,所以更改緩沖區(qū)功能對于I / O綁定的工作負(fù)載最有價值,例如具有大量DML操作的應(yīng)用程序(如批量插入)。
但是,Change Buffer占用Buffer Pool的一部分,從而減少了可用于緩存數(shù)據(jù)頁的內(nèi)存。如果工作集幾乎適合Buffer Pool,或者您的表具有相對較少的二級索引,則禁用Change Buffer可能很有用。
畢竟Change Buffer只適用于Buffer Pool外的頁面嘛。
可以使用innodb_change_buffering 配置參數(shù)
允許的innodb_change_buffering 值包括:
all
默認(rèn)值:所有操作
none
不要緩沖任何操作。
inserts
緩沖插入操作。
deletes
緩沖區(qū)刪除標(biāo)記操作。
changes
緩沖插入和刪除標(biāo)記操作。
purges
緩沖在后臺發(fā)生的物理刪除操作。
Change Pool內(nèi)部結(jié)構(gòu)
ibuf代表Insert Buffer,可以直接將其看成Change Buffer,為MySQL 5.5 之前Change Buffer就叫Insert Buffer
ibuf btree較大默認(rèn)為buffer pool size的25%,當(dāng)超過25%時,可能觸發(fā)用戶線程同步縮減ibuf btree。為何要將ibuf btree的大小和buffer pool大小相關(guān)聯(lián)呢 ? 一個比較重要的原因是防止ibuf本身占用過多的buffer pool資源。
配置Change Pool較大大小
該innodb_change_buffer_max_size 變量允許將Change Buffer的較大大小配置為緩沖池總大小的百分比。默認(rèn)情況下, innodb_change_buffer_max_size設(shè)置為25.較大設(shè)置為50。
使用測試不同的設(shè)置的業(yè)務(wù)性能以確定很好配置。該 innodb_change_buffer_max_size 設(shè)置是動態(tài)的,允許在不重新啟動服務(wù)器的情況下修改設(shè)置。類似innodb_buffer_pool_size也可以在線更改那種。
以上是“怎么配置Change Buffer”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!