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