什么是change buffer #
Change Buffer是InnoDB中的一个特殊的数据结构。在修改二级索引,而对应的page 不在buffer pool中时,它用于缓存对二级索引的修改。在随后对应的page 被加载到buffer pool中时,被缓存的change会被merge。
Change Buffer只适用于非唯一二级索引。对于唯一二级索引,InnoDB会立即将修改写入到磁盘。
在内存中,change buffer占用的空间是buffer pool的一部分。在磁盘中,change buffer占用的空间是表空间的一部分。
如果对应的二级索引包含descending index列,change buffer不会被使用。
什么时候会产生change buffer 操作? #
对二级索引进行插入、更新、删除操作时,如果对应的page不在buffer pool中,就会产生change buffer操作。
change buffer的作用 #
减少随机磁盘IO,提高性能。
change buffer是否支持其它类型的索引 #
不支持。只支持非唯一二级索引。聚簇索引、全文索引、空间索引都不支持。
change buffer占用多少内存 #
我们可以通过innodb_change_buffer_max_size参数来控制change buffer在buffer pool中所占的比例。在MySQL5.6版本及更高版本中,默认值是25,
最大值是50。
怎样查看change buffer当前的使用情况 #
我们可以通过show engine innodb status命令来查看change buffer的使用情况。、
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 3093, seg size 3095, 0 merges
merged operations:
insert 0, delete mark 0, delete 0
discarded operations:
insert 0, delete mark 0, delete 0
相关字段:
- size - change buffer使用的page数量。
- seg size - change buffer中的page数量。
什么时候会merge change buffer #
- 相关page被加载到buffer pool中时。
- 后台任务。
- 崩溃恢复。
- 服务正常关闭。
什么时候被刷新到磁盘 #
change buffer中的page的刷盘机制和buffer pool中其它page的刷盘机制相同。
什么时候应该使用change buffer #
change buffer的设计目的,是为了在二级索引变大时,减少随机磁盘IO,提高性能。通常,以下场景下,应该考虑使用change buffer:
- 二级索引的数据量很大,无法将所有数据加载到buffer pool中。
- 修改二级索引的DML操作较多。
- DML操作影响的二级索引较多。
什么时候不应该使用change buffer #
以下场景下,可以考虑禁用change buffer:
- 所有数据都可以被加载到buffer pool中。
- 二级索引的数量很少。
- 使用性能较好的SSD磁盘,随机读取磁盘的性能和顺序读取磁盘的性能相差不大。
在决定禁用change buffer时,应该进行测试,以确保禁用change buffer后,性能不会下降。