一、change buffer是什么?
change buffer是一种特殊的数据结构,当二级索引页
不在buffer pool
中时,它将更改缓存到二级索引页。缓冲的更改(可能由INSERT
、UPDATE
或DELETE
操作(DML)引起)稍后在其他读操作将页面加载到缓冲池时合并。
二、change buffer工作过程?
官网介绍图:
与聚簇索引
不同的是,二级索引通常不是惟一
的,并且二级索引的插入是以相对随机的顺序进行的。类似地,删除和更新可能会影响索引树中没有邻接位置的二级索引页。稍后,当其他操作将受影响的页读到缓冲池中时,合并缓存
的更改,可以避免从磁盘将次要索引页读到缓冲池中所需的大量随机访问I/O。
purge
操作会在系统大部分空闲或缓慢关闭期间定期将更新后的索引页写入磁盘。与立即将每个值写入磁盘相比,purge
操作可以更有效地将一系列索引值写入磁盘块。
当有许多受影响的行和许多次要索引需要更新时,change buffer
合并可能需要几个小时。在此期间,磁盘I/O会增加,这可能导致磁盘绑定查询的显著减速。在事务提交后,甚至在服务器关闭和重启后,更改缓冲区合并也可能继续发生(更多信息请参见15.21.2节“强制InnoDB恢复”)。
在内存中,change buffer
占buffer pool
的一部分。在磁盘上,change buffer
是系统表空间
的一部分,当数据库服务器关闭时,将在其中缓冲索引更改。
change buffer
中缓存的数据类型由innodb_change_buffering
变量控制。有关更多信息,请参见配置更改缓冲。您还可以配置最大更改缓冲区大小。有关更多信息,请参见配置更改缓冲区最大大小。
如果次要索引包含降序索引列,或者主键包含降序索引列,则不支持更改缓冲。
关于变更缓冲区的常见问题,请参见A.16节“MySQL 8.0 FAQ: InnoDB变更缓冲区”
未完待续......