更改缓冲区是将更改缓存到的特殊数据结构二级索引页,当这些页不在缓冲池.缓冲的更改,这可能导致插入
,更新
,或删除
当页面被其他读操作加载到缓冲池中时,这些操作(DML)将被合并。
不像聚集索引,辅助索引通常不是唯一的,并且对辅助索引的插入以相对随机的顺序发生。类似地,删除和更新可能会影响索引树中不相邻的二级索引页。稍后,当受影响的页被其他操作读入缓冲池时,合并缓存的更改可以避免大量的随机访问I/O,这将需要从磁盘将二级索引页读入缓冲池。
定期地,在系统大部分空闲或缓慢关机期间运行的清除操作将更新后的索引页写入磁盘。清除操作可以更有效地为一系列索引值写入磁盘块,而不是立即将每个值写入磁盘。
当有许多受影响的行和许多二级索引需要更新时,更改缓冲区合并可能需要几个小时。在此期间,磁盘I/O会增加,这可能会导致磁盘绑定查询的显著放缓。变更缓冲区合并也可能在事务提交后继续发生,甚至在服务器关闭和重新启动后也可能继续发生章节15.21.3,强制恢复InnoDB以获取更多信息)。
在内存中,更改缓冲区占用缓冲池的一部分。在磁盘上,更改缓冲区是系统表空间的一部分,当数据库服务器关闭时,索引更改将被缓冲在其中。
更改缓冲区中缓存的数据类型由innodb_change_buffering
变量。有关更多信息,请参见配置变更缓冲.您还可以配置最大变更缓冲区大小。有关更多信息,请参见配置变更缓冲区的最大大小.
如果索引包含降序索引列,或者如果主键包含降序索引列,则辅助索引不支持更改缓冲。
有关更改缓冲区的常见问题的答案,请参见第A.16节,“MySQL 8.0常见问题:InnoDB Change Buffer”.
当插入
,更新
,删除
当在表上执行操作时,索引列的值(特别是辅助键的值)通常是无序的,需要大量的I/O来更新辅助索引。的改变缓冲将相关的更改缓存到次要索引项页面不在缓冲池,从而避免了昂贵的I/O操作,因为不立即从磁盘读入页面。当页面加载到缓冲池中时,将合并缓冲的更改,稍后将更新的页面刷新到磁盘。的InnoDB
当服务器接近空闲时,主线程合并缓冲的更改缓慢关闭.
因为它可以导致更少的磁盘读写,所以更改缓冲对于I/ o约束的工作负载最有价值;例如,具有大量DML操作(如批量插入)的应用程序受益于更改缓冲。
但是,更改缓冲区占用了缓冲池的一部分,从而减少了用于缓存数据页的可用内存。如果工作集几乎适合缓冲池,或者表的次要索引相对较少,那么禁用更改缓冲可能会很有用。如果工作数据集完全适合缓冲池,则更改缓冲不会带来额外的开销,因为它只应用于缓冲池之外的页面。
的innodb_change_buffering
变量控制的程度InnoDB
执行更改缓冲。您可以启用或禁用插入、删除操作(当索引记录最初被标记为删除时)和清除操作(当索引记录被物理删除时)的缓冲。更新操作是插入和删除的组合。默认的innodb_change_buffering
值是所有
.
允许innodb_change_buffering
值包括:
所有
默认值:缓冲区插入、删除标记操作和清除。
没有一个
不要缓冲任何操作。
插入
缓冲区插入操作。
删除
缓冲区删除标记操作。
变化
缓冲插入和删除标记操作。
清洗
缓冲在后台发生的物理删除操作。
您可以设置innodb_change_buffering
MySQL选项文件中的变量(my.cnf
或my.ini
)或使用集全球
语句,它需要足够的权限来设置全局系统变量。看到第5.1.9.1节,“系统变量特权”.更改设置会影响新操作的缓冲;现有缓冲项的合并不会受到影响。
的innodb_change_buffer_max_size
变量允许将更改缓冲区的最大大小配置为缓冲池总大小的百分比。默认情况下,innodb_change_buffer_max_size
设置为25。最大设置为50。
考虑增加innodb_change_buffer_max_size
在有大量插入、更新和删除活动的MySQL服务器上,其中更改缓冲区合并没有跟上新的更改缓冲区条目,导致更改缓冲区达到其最大大小限制。
考虑减少innodb_change_buffer_max_size
在MySQL服务器上使用静态数据进行报告,或者如果更改缓冲区消耗了太多与缓冲池共享的内存空间,导致页面比预期的更早老化出缓冲池。
使用具有代表性的工作负载测试不同的设置,以确定最佳配置。的innodb_change_buffer_max_size
变量是动态的,允许在不重新启动服务器的情况下修改设置。
以下选项可用于更改缓冲区监视:
InnoDB
标准监视器输出包括更改缓冲区状态信息。命令可以查看监控器数据显示引擎innodb状态
声明。显示引擎INNODB状态\G
更改缓冲区状态信息位于
插入缓冲区和自适应哈希索引
标题和显示类似于以下:------------------------------------- INSERT BUFFER AND ADAPTIVE HASH INDEX ------------------------------------- Ibuf: size 1, free list len 0, seg size 2,0合并合并操作:插入0,删除标记0,删除0丢弃操作:插入0,删除标记0,删除0哈希表大小4425293,使用的单元格32,节点堆有1个缓冲区(s) 13577.57哈希搜索/s, 202.47非哈希搜索/s
有关更多信息,请参见章节15.17.3,InnoDB标准监控器和锁监控器输出.
的
INFORMATION_SCHEMA。INNODB_METRICS
表中提供了大部分数据点InnoDB
标准监视器输出加上其他数据点。要查看变更缓冲区指标和每个指标的描述,发出以下查询:从INFORMATION_SCHEMA中选择名称和注释。WHERE名称为“%ibuf%”\G
为
INNODB_METRICS
表使用信息,参见章节15.15.6“InnoDB INFORMATION_SCHEMA度量表”.的
INFORMATION_SCHEMA。INNODB_BUFFER_PAGE
表提供了关于缓冲池中每个页面的元数据,包括更改缓冲区索引和更改缓冲区位图页面。更改缓冲区页由PAGE_TYPE
.IBUF_INDEX
更改缓冲区索引页的页类型和IBUF_BITMAP
更改缓冲区位图页的页类型。警告查询
INNODB_BUFFER_PAGE
表可能会带来显著的性能开销。为了避免影响性能,请在测试实例上重现您想要调查的问题,并在测试实例上运行您的查询。例如,可以查询
INNODB_BUFFER_PAGE
确定表的大概数目IBUF_INDEX
而且IBUF_BITMAP
页数占缓冲池总页数的百分比。mysql> SELECT (SELECT (*) FROM INFORMATION_SCHEMA)INNODB_BUFFER_PAGEWHERE PAGE_TYPE LIKE 'IBUF%') AS change_buffer_pages, (SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE) AS total_pages, (SELECT ((change_buffer_pages/total_pages)*100)) AS change_buffer_page_percentage; +---------------------+-------------+-------------------------------+ | change_buffer_pages | total_pages | change_buffer_page_percentage | +---------------------+-------------+-------------------------------+ | 25 | 8192 | 0.3052 | +---------------------+-------------+-------------------------------+
有关本网站提供的其他资料
INNODB_BUFFER_PAGE
表,请参阅章节26.4.2,“INFORMATION_SCHEMA INNODB_BUFFER_PAGE表”.有关使用信息,请参见章节15.15.5,InnoDB INFORMATION_SCHEMA缓冲池表.性能模式为高级性能监视提供更改缓冲区互斥量等待检测。要查看更改缓冲区插装,发出以下查询:
mysql> SELECT * FROM performance_schemasetup_instruments WHERE NAME LIKE '%wait/sync /mutex/innodb/ibuf%';+-------------------------------------------------------+---------+-------+ | 名字| |定时启用 | +-------------------------------------------------------+---------+-------+ | 等待/同步/互斥/ innodb / ibuf_bitmap_mutex |是的| | |等待/同步/互斥/ innodb / ibuf_mutex |是的| | |等待/同步/互斥/ innodb / ibuf_pessimistic_insert_mutex | |是的 | +-------------------------------------------------------+---------+-------+
有关监控的信息
InnoDB
互斥体在等待,看章节15.16.2“使用性能模式监视InnoDB互斥锁等待”.