加载中...
变更缓冲是 MySQL InnoDB 的一项写优化机制。当对不在缓冲池中的二级索引页执行写操作时,InnoDB 先把变更暂存起来,待相关页被读入内存时再合并应用,从而把随机的索引磁盘 I/O 转化为更高效的批量操作。

| 所属引擎 | MySQL InnoDB |
| 优化对象 | 非唯一二级索引写入 |
| 核心手段 | 延迟合并变更 |
| 优化效果 | 减少随机磁盘 I/O |
| 不适用 | 唯一索引 |
变更缓冲(Change Buffer)是 MySQL 的 InnoDB 存储引擎用于优化二级索引写入的机制。当对某个非唯一二级索引页进行插入、删除或更新,而该页当前不在缓冲池中时,InnoDB 不会立即把它从磁盘读入,而是把这次变更暂存到变更缓冲中,等到该页因其他原因被读入内存时再一并合并。
对二级索引的写操作往往是随机分布的,如果每次都要先把目标索引页从磁盘读进内存再修改,会产生大量随机读 I/O,严重拖慢写入。变更缓冲通过延迟合并,把这些零散的随机写攒起来,在页被真正需要时批量应用,从而把多次随机 I/O 合并为更少、更高效的操作。变更缓冲本身也是缓冲池的一部分,并会被持久化以保证不丢失。
变更缓冲对写多读少、二级索引较多、且数据量远大于内存的表最有效,例如批量导入、日志型写入等场景。它能明显减少索引维护带来的随机磁盘 I/O,提升整体写入吞吐。
问:为什么唯一索引用不上变更缓冲?答:唯一索引在写入时必须立即读入相关页来检查是否存在重复键,无法延迟到合并阶段,因此不能使用变更缓冲。
问:变更缓冲会一直变大吗?答:不会无限制增长。它占用缓冲池的一部分,大小有上限配置,并随着页被读入而不断合并释放。

| 所属引擎 | MySQL InnoDB |
| 优化对象 | 非唯一二级索引写入 |
| 核心手段 | 延迟合并变更 |
| 优化效果 | 减少随机磁盘 I/O |
| 不适用 | 唯一索引 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧