MySQL的Change Buffer是什么?它有什么作用?
重要内容
Change Buffer是一个内存区域,用于存储即将应用到磁盘上的二级索引页的记录更改
- 当一个二级索引的记录被更新或删除时,这些更改不会立即被写回到磁盘上,而是先被暂存到 Change Buffer 中
- 然后存储引擎 InnoDB 在一定条件下会去集中将变更写入到磁盘中(如 页被读取 或 Flush操作)
作用
- 减少随机磁盘I/O:通过将多个离散的索引页修改操作合并为集中顺序写入,显著降低磁盘寻道开销。例如,100次非连续索引更新可能仅需1次磁盘写入
- 提升写入吞吐量:批量写入优化,适用于写多读少场景
扩展知识
change buffer 运用的示例
假设表里面有3列,分别是 id、name、age (id 是主键、name 是非唯一的二级索引
执行更新语句:update xx set name = "yyy" where name = “zzz” 执行流程如下
- 检查需要被更新的数据是否在
buffer pool中 - 如果在
buffer pool中直接将其更新 - 如果不在
buffer pool里面,先缓存到change buffer中- 等到进行磁盘的 I/O 操作的时候,将其读取内存中,再更新语句
- 在系统空闲时或慢速关闭时,执行清除操作,将更新后的数据写入磁盘
下图是 Buffer Pool 和 Change Buffer 之间的关系
配置 Change Buffer 参数
- 参数
innodb_change_buffering用来控制是否启用更改缓冲 Change Buffer - 参数
innodb_change_buffer_max_size用来设置 Change Buffer能占用 Buffer Pool的最大比例(默认值为25%,最大值可以设置为50%)合理配置可以提升性能,但过大可能导致内存不足
SHOW VARIABLES LIKE 'innodb_change_buffer_max_size'
# 结果为: innodb_change_buffer_max_size 25