MySQL的Change Buffer是什么?它有什么作用?

157 阅读2分钟

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” 执行流程如下

  1. 检查需要被更新的数据是否在 buffer pool
  2. 如果在 buffer pool 中直接将其更新
  3. 如果不在 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