Change Buffer 是 InnoDB 中用于缓存非唯一二级索引页变更的内存结构,仅在对应页未加载时生效,通过延迟合并(访问页、后台线程、淘汰前、关闭前)减少随机 I/O,提升写性能。
MySQL 的 Change Buffer(变更缓冲区)是 InnoDB 存储引擎中用于优化非唯一二级索引(Secondary Index)写入性能的重要机制,它不是“合并机制”本身,而是为后续的 异步合并(Merge) 做准备的临时缓存结构。
当对一张表执行 INSERT、UPDATE 或 DELETE 操作时,如果涉及的二级索引页(B+ 树叶子节点)当前不在 Buffer Pool(内存缓存)中,InnoDB 不会立即将磁盘上的索引页读入内存再修改,而是把这次变更记录到 Change Buffer 中——一个位于 Buffer Pool 内的特殊区域(逻
辑上属于 Buffer Pool,但物理上可独立管理)。
它只适用于满足以下条件的操作:
Merge 不是定时或主动发起的“合并任务”,而是在特定访问场景下被动触发的延迟处理过程。核心触发时机包括:
本质是用空间换时间,缓解随机 I/O 压力:
注意:Change Buffer 太大会占用 Buffer Pool 空间,影响其他数据页缓存;可通过 innodb_change_buffer_max_size 参数限制其最大占比(默认 25%,即最多占 Buffer Pool 的 1/4)。
可通过以下方式确认 Change Buffer 工作状态:
SHOW STATUS LIKE 'Innodb_ibuf%'; 关注 Innodb_ibuf_size(当前大小)、Innodb_ibuf_merges(总合并次数)、Innodb_ibuf_merge_inserts/upd/delete_marks(各类 merge 数量)innodb_change_buffer_max_size 可提升写入吞吐;但 OLTP 主键查询多的业务,应保持默认或略降,避免挤占热数据缓存它不改变 SQL 语义,也不影响事务一致性——所有变更在 merge 前仍受 undo log 和 redo log 保护,崩溃恢复时可通过 redo 重放 Change Buffer 内容。