Change Buffer屬於Innodb內存中的一塊結構,它主要用來緩存對二級索引數據的修改(insert, update, delete)操做當二級索引不在Buffer pool中的時候,這些寫操做會在稍後合併到二級索引當二級索引被其餘讀請求加載到buffer pool的時候。html
不一樣於聚簇索引,二級索引一般不是惟一的,插入二級索引的順序是相對隨機的,刪除和更新操做也可能會影響二級索引中不想臨的頁,在稍後當受影響的頁被其餘操做加載到buffer pool的時候會合並緩存在change buffer的更新,以此來避免大量的隨機IO操做。node
這些合併操做會在系統空閒的時候按期執行,或者在系統關閉的時候,將這些對索引頁的更新寫入磁盤。比起每次更新都寫磁盤,這種purge 操做可以更有效的將一系列更新寫入磁盤塊。mysql
當有許多被影響的行和大量的二級索引被更新,change buffer的合併操做可能會花費幾個小時的時間。在這期間,磁盤IO會增長,這也會致使明顯的磁盤查詢緩慢。change buffer 合併可能在事務提交後繼續執行,甚至MySQL server 重啓以後。sql
在內存中,change buffer佔用buffer pool的一部分,在磁盤上,change buffer是系統表空間(system tablespace)的一部分,當服務器停機的時候,change buffer會緩存在磁盤上。緩存
change buffer 不支持包含逆序或者主鍵包含一個逆序字段的索引。服務器
配置 Change Bufferingspa
因爲它能減小磁盤讀寫,Change buffer的特性對於IO高的應用最有用,好比有大量DML操做如批量插入的應用。code
然而,change buffer佔用了buffer pool的一部分,減小了用於緩存數據頁的內存。若是工做集很是適合buffer pool(buffer pool中能緩存下全部的數據和索引),或者你的表有不多的二級索引,那麼禁用change buffer也許是有用的。server
使用 innodb_change_buffering
來配置change buffer中緩存的數據類型,默認值爲 all ;htm
此值的取值有:
使用 innodb_change_buffer_max_size 變量來配置change buffer的大小,這是一個百分比值,佔整個buffer pool的比例,默認值爲25,最大能夠設置爲 50,也就是佔用buffer pool的一半。
監控 Change Buffer
mysql> SHOW ENGINE INNODB STATUS\G
change buffer的統計信息在 INSERT BUFFER AND ADAPTIVE HASH INDEX 這行下面
1 ------------------------------------- 2 INSERT BUFFER AND ADAPTIVE HASH INDEX 3 ------------------------------------- 4 Ibuf: size 1, free list len 0, seg size 2, 0 merges 5 merged operations: 6 insert 0, delete mark 0, delete 0 7 discarded operations: 8 insert 0, delete mark 0, delete 0 9 Hash table size 4425293, used cells 32, node heap has 1 buffer(s) 10 13577.57 hash searches/s, 202.47 non-hash searches/s