文章目录
1、简述
变更缓冲区是一种特殊的数据结构,当这些页面不在缓冲池中时,该高速缓存会将更改缓存到辅助索引页面。缓冲的更改(可能由INSERT,UPDATE或DELETE操作(DML)引起)将在以后通过其他读取操作将页面加载到缓冲池中时合并。
与聚簇索引不同,二级索引通常是非唯一的,并且二级索引的插入以相对随机的顺序发生。同样,删除和更新可能会影响索引树中不相邻的二级索引页。稍后,当通过其他操作将受影响的页读入缓冲池时,合并缓存的更改可以避免从磁盘将辅助索引页读入缓冲池所需的大量随机访问I / O。
在系统大部分处于空闲状态或关机期间运行的清除操作会定期将更新的索引页写入磁盘。与每个值立即写入磁盘相比,清除操作可以更有效地将一系列索引值写入磁盘块。
当有许多受影响的行和许多辅助索引要更新时,变更缓冲区合并可能需要几个小时。在此期间,磁盘I / O会增加,这可能会导致磁盘定查询的速度大大降低。提交事务之后,甚至在服务器关闭并重新启动之后,变更缓冲区合并也可能继续发生。
在内存中,变更缓冲区占用了缓冲池的一部分。在磁盘上,变更缓冲区是系统表空间的一部分,当数据库服务器关闭时,索引更改将存储在其中。
变更缓冲区中缓存的数据类型由 innodb_change_buffering变量控制。
如果索引包含降序索引列或主键包含降序索引列,则辅助索引不支持更改缓冲。
2、配置变更缓冲区
当对表执行INSERT,UPDATE和DELETE操作时,索引列的值(尤其是辅助键的值)通常处于未排序的顺序,需要大量的I/O才能使辅助索引保持最新状态。当相关页面不在缓冲池中时,变更缓冲区将更改缓存到辅助索引条目,从而避免了立即从磁盘读取页面进而避免了昂贵的I/O操作。
当页面加载到缓冲池中时,缓冲的更改将合并,更新的页面随后将刷新到磁盘。当服务器接近闲置时以及在关闭期间,InnoDB主线程会合并缓冲的更改。
由于变更缓冲区功能可以减少磁盘读写操作,因此它对于受I/O限制的工作(例如,具有大量DML操作的应用程序,例如批量插入)显得更有价值。
但是,变更缓冲区占用了缓冲池的一部分,从而减少了可用于缓存数据页的内存。如果工作集可以填充缓冲池,或者您的表具有相对较少的二级索引,则禁用变更缓冲区更加合适。如果缓冲池可以完全容纳数据集,则变更缓冲区不会带来额外的开销,因为它仅适用于不在缓冲池中的页面。
您可以使用 innodb_change_buffering 配置参数来控制InnoDB执行更改缓冲的程度。您可以为插入,删除操作(将索引记录标记为删除)和清除操作(物理删除索引记录)启用或禁用缓冲。更新操作是插入和删除的组合。默认的innodb_change_buffering值为all。
innodb_change_buffering 值包括:
-
all :默认值,缓冲区插入,删除和清除。
-
none:不缓存任何操作
-
inserts:缓冲区插入操作。
-
deletes:缓冲区删除标记操作。
-
changes:缓冲区插入和删除标记操作。
-
purges:缓冲区在后台发生的物理删除操作。
可以在MySQ