Change Buffer 是 MySql InnoDB 存储引擎中的一个机制,用于暂存对二级索引的插入和更新操作的变更,而不立即执行这些操作,随后,当 InnoDB 进行合适的条件时(如页被读取或Flush 操作),会将这些变更写入到二级索引中。
      作用:

  • 提高写入性能:通过将对二级索引的变更暂存,可以减少对磁盘的频繁写入,提升插入和更新操作的性能
  • 批量处理:Change Buffer 可以在后续操作中批量处理这些变更,减少了随机写入的开销

进一步理解 Change Buffer

请输入图片描述

      从上图可以看到,Change Buffer 是位于 Buffer Pool 中的。
1)那 Change Buffer 具体是个什么东西呢?
      如果当前表针对 name 字段有个二级索引。假设我们执行一条update table set name='zhangsan' where id=1;(这条语句需要修改name这个二级索引中的数据),此时 buffer pool 并没有对应二级索引的索引页数据。但是,InnoDB 不会将索引页的数据加载到内存中立即执行修改。而是将更新操作缓存到 Change Buffer 中,当下次访问到这条数据后,会把索引页加载到 Buffer Pool 中,并且应用上 Change Buffer 里面的变更,这样保证了数据的一致性。

上述 SQL 中,Change Buffer 中会存储name字段的旧索引值删除操作和新索引值插入操作

2)Change Buffer 有什么好处?
      当二级索引页不在 Buffer Pool 中时,Change Buffer 可以避免立即从磁盘读取对应索引页导致的昂贵的随机 I/O,对应的更改可以在后面当二级索引页读入 Buffer Bool 时候被批量应用。

Change Buffer 只能用于二级索引的更改,不适用于主键索引,空间索引,以及全文索引。唯一索引也不行,因为唯一索引需要读取数据然后检查数据的一致性。

3)更改先缓存在 Change Buffer 中,加入数据库挂了,更改不是丢了吗?
      Change Buffer 也是要落盘存储的,从上图中我们可以看到 Change Buffer 会落盘到系统表空间中,然后 redo log 会记录 Change Buffer 的修改来保证数据一致性。

Change Buffer 的大小

      Change Buffer 的大小可以通过系统变量innodb_change_buffer_max_size进行配置,默认值为25%的 InnoDB Buffer Pool 大小,最大值可以设置为50%。合理配置可以提升性能,但过大可能导致内存不足。

Last modification:April 26th, 2025 at 10:03 pm
如果觉得我的文章对你有用,请随意赞赏