Change Buffer的作用:
- 作用於不在緩存池中的非唯一索引頁
- 對該頁進行寫操作后並不會立刻將該頁從磁盤中加載到緩存池,而是在change buffer中記錄頁的修改,等該頁被讀取時,再將修改的數據merger到緩存池中;
- 以此來緩解寫操作多次隨機讀的IO消耗;
- 當索引中包含降序索引或者主鍵中包含降序索引時不會用到change buffer;
- 當change buffer大小超過最大閾值后不會再使用change buffer;
merge策略:
- 被動merge:當用戶線程主動發起change buffer中索引頁的讀取操作時,會被動的將頁的修改記錄merge到原始索引頁中;
- 主要merge:master thread定期將change buffer中的記錄隨機刷回索引頁,如果每秒master thread有空閑I/O能力,則刷5個緩存索引頁,每10秒不管I/O壓力都會刷5個緩存的索引頁記錄;
相關參數:
innodb_change_buffer_max_size = 25 #默認25表示change buffer最大可以占用innodb buffer的25%,最大可設置的值為50
innodb_change_buffering = all #默認all表示所有的非唯一普通索引頁寫入都使用change buffer
all
none #關閉change buffer
inserts #緩沖插入操作
deletes #緩沖刪除操作
changes #緩沖插入和刪除操作
purges #緩沖在后台發生的物理刪除操作
相關監控信息:
show engine innodb status\G
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 3077, seg size 3079, 3338271 merges
merged operations:
insert 3679942, delete mark 333798, delete 1737
discarded operations:
insert 0, delete mark 0, delete 0
#size 1 正在使用的page
#free list len 3077 空閑的page
#seg size 3079 當前change buffer大小3079*16K
#3338271 merges 合並的數目
#insert 3679942 通過change buffer插入的數目
#delete mark 333798 通過change buffer刪除的數目
#delete 1737 通過change buffer purge的數目
#change buffer的效果=merges/(insert+delete mark+delete)結果越小說明change buffer對性能提升越有利
mysql> select NAME,COUNT,MAX_COUNT,MIN_COUNT,AVG_COUNT,COMMENT from information_schema.innodb_metrics where name like '%ibuf%';
+-----------------------------------------+---------+-----------+-----------+--------------------------+-------------------------------------------------------------+
| NAME | COUNT | MAX_COUNT | MIN_COUNT | AVG_COUNT | COMMENT |
+-----------------------------------------+---------+-----------+-----------+--------------------------+-------------------------------------------------------------+
| buffer_page_read_index_ibuf_leaf | 0 | NULL | NULL | NULL | Number of Insert Buffer Index Leaf Pages read |
| buffer_page_read_index_ibuf_non_leaf | 0 | NULL | NULL | NULL | Number of Insert Buffer Index Non-Leaf Pages read |
| buffer_page_read_ibuf_free_list | 0 | NULL | NULL | NULL | Number of Insert Buffer Free List Pages read |
| buffer_page_read_ibuf_bitmap | 0 | NULL | NULL | NULL | Number of Insert Buffer Bitmap Pages read |
| buffer_page_written_index_ibuf_leaf | 0 | NULL | NULL | NULL | Number of Insert Buffer Index Leaf Pages written |
| buffer_page_written_index_ibuf_non_leaf | 0 | NULL | NULL | NULL | Number of Insert Buffer Index Non-Leaf Pages written |
| buffer_page_written_ibuf_free_list | 0 | NULL | NULL | NULL | Number of Insert Buffer Free List Pages written |
| buffer_page_written_ibuf_bitmap | 0 | NULL | NULL | NULL | Number of Insert Buffer Bitmap Pages written |
| ibuf_merges_insert | 3681684 | 3681684 | NULL | 0.9494142111810469 | Number of inserted records merged by change buffering |
| ibuf_merges_delete_mark | 333962 | 333962 | NULL | 0.08612044618561636 | Number of deleted records merged by change buffering |
| ibuf_merges_delete | 1740 | 1740 | NULL | 0.0004487024762187688 | Number of purge records merged by change buffering |
| ibuf_merges_discard_insert | 0 | 0 | NULL | 0 | Number of insert merged operations discarded |
| ibuf_merges_discard_delete_mark | 0 | 0 | NULL | 0 | Number of deleted merged operations discarded |
| ibuf_merges_discard_delete | 0 | 0 | NULL | 0 | Number of purge merged operations discarded |
| ibuf_merges | 3340164 | 3340164 | NULL | 0.8613447458487284 | Number of change buffer merges |
| ibuf_size | 1 | 699 | NULL | 0.0000002578749863326257 | Change buffer size in pages |
| innodb_ibuf_merge_usec | 0 | NULL | NULL | NULL | Time (in microseconds) spent to process change buffer merge |
+-----------------------------------------+---------+-----------+-----------+--------------------------+-------------------------------------------------------------+
change buffer局限:
- 需要作用於非唯一索引,因為非唯一索引不要校驗數據重復;
- change buffer會占用一定的innodb buffer空間;
