更改缓冲区是一种特殊的数据结构,当二级索引页不在缓冲池中时,这些 高速缓存将缓存这些更改 。当页面通过其他读取操作加载到缓冲池中时,可能由INSERT, UPDATE或 DELETE操作(DML)导致的缓冲更改 将在以后合并。
与聚簇索引不同,二级索引通常是非唯一的,并且二级索引的插入以相对随机的顺序发生。同样,删除和更新可能会影响索引树中不相邻的二级索引页。稍后,当通过其他操作将受影响的页读入缓冲池时,合并缓存的更改可以避免从磁盘将辅助索引页读入缓冲池所需的大量随机访问I / O。
在系统大部分处于空闲状态或缓慢关机期间运行的清除操作会定期将更新的索引页写入磁盘。与将每个值立即写入磁盘相比,清除操作可以更有效地为一系列索引值写入磁盘块。
当有许多受影响的行和许多辅助索引要更新时,更改缓冲区合并可能需要几个小时。在此期间,磁盘I / O会增加,这可能会导致磁盘绑定查询的速度大大降低。提交事务之后,甚至在服务器关闭并重新启动之后,更改缓冲区合并也可能继续发生( 有关更多信息,请参见第15.21.2节“强制InnoDB恢复”)。
在内存中,更改缓冲区占用了缓冲池的一部分。在磁盘上,更改缓冲区是系统表空间的一部分,当数据库服务器关闭时,索引更改将存储在其中。
更改缓冲区中缓存的数据类型由 innodb_change_buffering变量控制。有关更多信息,请参见 配置变更缓冲。您还可以配置最大更改缓冲区大小。有关更多信息,请参见 配置更改缓冲区最大大小。
如果索引包含降序索引列或主键包含降序索引列,则辅助索引不支持更改缓冲。
有关更改缓冲区的常见问题的答案,请参见第A.16节“ MySQL 8.0 FAQ:InnoDB更改缓冲区”。<