溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么配置Change Buffer

發(fā)布時(shí)間:2021-12-08 09:28:07 來(lái)源:億速云 閱讀:218 作者:小新 欄目:數(shù)據(jù)庫(kù)

小編給大家分享一下怎么配置Change Buffer,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

  Change Buffer是一種特殊的數(shù)據(jù)結(jié)構(gòu),緩存對(duì)二級(jí)索引頁(yè)面的更改并且這些頁(yè)面不在Buffer Pool中。緩存的changes可能由 Insert 、Delete 和 Update的結(jié)果導(dǎo)致。稍后在頁(yè)面被其他讀取操作加載到Buffer Pool的時(shí)候合并。

  簡(jiǎn)而言之:Change buffer的主要目的是將對(duì)二級(jí)索引的數(shù)據(jù)操作緩存下來(lái),以此減少二級(jí)索引的隨機(jī)IO,并達(dá)到操作合并的效果。

  與聚簇索引(ps:默認(rèn)是InnoDB里的主鍵,主鍵是聚集存儲(chǔ)的)不同,二級(jí)索引通常不是唯一的,并且插入二級(jí)索引的順序相對(duì)隨機(jī)。刪除和更新可能會(huì)影響不在索引樹(shù)中相鄰的二級(jí)索引頁(yè)。當(dāng)受影響的頁(yè)面被其他操作讀入緩沖池時(shí),合并緩存的更改,避免了從磁盤讀取二級(jí)索引頁(yè)到緩沖池所需的大量隨機(jī)訪問(wèn)I / O。

  在MySQL5.5之前的版本中,由于只支持緩存insert操作,所以最初叫做insert buffer,只是后來(lái)的版本中支持了更多的操作類型緩存,才改叫change buffer,所以本文是基于MySQL5.5之后的版本。

  (Secondary Index(二級(jí)索引)

  1、也可以稱為 非聚集索引

  2、葉子節(jié)點(diǎn)存儲(chǔ)的是索引和主鍵信息

  3、在找到索引后,得到對(duì)應(yīng)的主鍵,再回到聚集索引 中找主鍵對(duì)應(yīng)的記錄(row data))

  放出二級(jí)索引的解釋可能還是懵,什么時(shí)候算作二級(jí)索引,所有主鍵以外的索引都是二級(jí)索引(innodb默認(rèn))。

  所以說(shuō)根據(jù)主鍵訪問(wèn)數(shù)據(jù)(永遠(yuǎn)是效果最好的方式),原因看上方括號(hào)內(nèi)二級(jí)索引介紹

  為何需要Change Buffer

  表的索引存于該表的ibd文件中,數(shù)據(jù)也存于此文件。表數(shù)據(jù)更新的同時(shí)也會(huì)更新對(duì)應(yīng)的表的索引數(shù)據(jù),所以:例如對(duì)表進(jìn)行insert時(shí),很可能會(huì)產(chǎn)生大量的物理讀(物理讀索引數(shù)據(jù)頁(yè)),insert一個(gè)表,對(duì)應(yīng)的表上面的索引會(huì)變動(dòng),索引不常使用,產(chǎn)生物理讀,索引順序和表不一致耗時(shí)。

  (物理讀(Physical Reads):從磁盤讀取數(shù)據(jù)塊到內(nèi)存的操作叫物理讀,當(dāng)緩存不存在這些數(shù)據(jù)塊的時(shí)候就會(huì)產(chǎn)生物理讀,物理讀過(guò)大表現(xiàn)為磁盤 I/O 較高)

  所以將對(duì)索引的更新記錄存入Change Buffer中,而不是直接調(diào)入索引頁(yè)進(jìn)行更新;選擇時(shí)機(jī)進(jìn)行merge insert buffer的操作,將insert buffer中的記錄合并(merge)到真正的輔助索引中。

  系統(tǒng)大部分空閑時(shí)或在慢速關(guān)閉期間運(yùn)行的清除(purge)操作會(huì)定期將更新的索引頁(yè)寫(xiě)入磁盤。與每個(gè)值立即寫(xiě)入磁盤相比,purge操作可以更有效地為一系列索引值寫(xiě)入磁盤塊。

  當(dāng)有許多受影響的行和許多要更新的二級(jí)索引時(shí),Change Buffer合并可能需要幾個(gè)小時(shí)。在此期間,磁盤I / O會(huì)增加,這會(huì)導(dǎo)致磁盤綁定查詢顯著減慢。在提交事務(wù)之后,甚至在服務(wù)器關(guān)閉并重新啟動(dòng)之后,更改緩沖區(qū)合并也可能繼續(xù)發(fā)生

  在內(nèi)存中,Change Buffer占用Buffer Pool的一部分。在磁盤上,Change Buffer是系統(tǒng)表空間的一部分,其中的索引會(huì)在關(guān)閉數(shù)據(jù)庫(kù)服務(wù)器時(shí)更改。

  配置Change Buffer

  對(duì)表執(zhí)行 INSERT,UPDATE和 DELETE操作時(shí), 索引列的值(尤其是secondary keys的值)通常按未排序順序排列,需要大量I / O才能使二級(jí)索引更新。Change Buffer會(huì)緩存這個(gè)更新當(dāng)相關(guān)頁(yè)面不在Buffer Pool中,從而磁盤上的相關(guān)頁(yè)面不會(huì)立即被讀避免了昂貴的I / O操作。當(dāng)頁(yè)面加載到緩沖池中時(shí),將合并緩沖的更改,稍后將更新的頁(yè)面刷新到磁盤。該InnoDB主線程在服務(wù)器幾乎空閑時(shí)以及在慢速關(guān)閉期間合并緩沖的更改 。

  為方便理解:來(lái)了一個(gè)關(guān)于二級(jí)索引頁(yè)面的DML操作,并且這個(gè)頁(yè)面沒(méi)有在Buffer Pool內(nèi),那么把這個(gè)操作存入Change Buffer(MySQL5.5之前的版本叫Insert Buffer),ok,那么下一次需要加載這個(gè)頁(yè)面的時(shí)候,也就是這個(gè)頁(yè)面有需求的時(shí)候,會(huì)將Change Buffer內(nèi)的更改合并到Buffer Pool,隨后當(dāng)服務(wù)器在空閑的時(shí)候,這個(gè)更改會(huì)刷到disk(磁盤)上。所以一開(kāi)始那張很難讀的圖的流程就清晰了:(黃色箭頭這樣的走勢(shì))

  因?yàn)樗梢詼p少磁盤讀取和寫(xiě)入,所以更改緩沖區(qū)功能對(duì)于I / O綁定的工作負(fù)載最有價(jià)值,例如具有大量DML操作的應(yīng)用程序(如批量插入)。

  但是,Change Buffer占用Buffer Pool的一部分,從而減少了可用于緩存數(shù)據(jù)頁(yè)的內(nèi)存。如果工作集幾乎適合Buffer Pool,或者您的表具有相對(duì)較少的二級(jí)索引,則禁用Change Buffer可能很有用。

  畢竟Change Buffer只適用于Buffer Pool外的頁(yè)面嘛。

  可以使用innodb_change_buffering 配置參數(shù)

  允許的innodb_change_buffering 值包括:

  all

  默認(rèn)值:所有操作

  none

  不要緩沖任何操作。

  inserts

  緩沖插入操作。

  deletes

  緩沖區(qū)刪除標(biāo)記操作。

  changes

  緩沖插入和刪除標(biāo)記操作。

  purges

  緩沖在后臺(tái)發(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)超過(guò)25%時(shí),可能觸發(fā)用戶線程同步縮減ibuf btree。為何要將ibuf btree的大小和buffer pool大小相關(guān)聯(lián)呢 ? 一個(gè)比較重要的原因是防止ibuf本身占用過(guò)多的buffer pool資源。

  配置Change Pool最大大小

  該innodb_change_buffer_max_size 變量允許將Change Buffer的最大大小配置為緩沖池總大小的百分比。默認(rèn)情況下, innodb_change_buffer_max_size設(shè)置為25.最大設(shè)置為50。

  使用測(cè)試不同的設(shè)置的業(yè)務(wù)性能以確定最佳配置。該 innodb_change_buffer_max_size 設(shè)置是動(dòng)態(tài)的,允許在不重新啟動(dòng)服務(wù)器的情況下修改設(shè)置。類似innodb_buffer_pool_size也可以在線更改那種。

以上是“怎么配置Change Buffer”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI