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 里面的变更,这样保证了数据的一致性。
name
字段的旧索引值删除操作和新索引值插入操作
2)Change Buffer 有什么好处?
当二级索引页不在 Buffer Pool 中时,Change Buffer 可以避免立即从磁盘读取对应索引页导致的昂贵的随机 I/O,对应的更改可以在后面当二级索引页读入 Buffer Bool 时候被批量应用。
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%。合理配置可以提升性能,但过大可能导致内存不足。
版权属于:带翅膀的猫
本文链接:https://www.chengpengper.cn/archives/238/
转载时须注明出处及本声明