Change Buffer
什么是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后,性能不会下降。