摘要: Change Buffer是一种特殊的数据结构,用于缓存二级索引页的更改操作,当这些页不在缓冲池中时。本文将介绍Change Buffer的工作原理、优势和配置,并提供了监控Change Buffer的方法。
Change Buffer是InnoDB存储引擎中的一个重要特性,它通过缓存二级索引页的更改操作,避免了从磁盘读取这些页所需的随机访问IO。当执行INSERT、UPDATE或DELETE操作时,Change Buffer会缓存变更,并在其他读操作将这些页加载到缓冲池时进行合并。
相对于聚簇索引而言,二级索引通常是非唯一的,对二级索引的插入操作往往是相对随机的。同样,删除和更新操作可能会影响不相邻的二级索引页。通过在后续的读操作中合并缓存的变更,可以避免大量的随机访问IO,这些IO本来需要将二级索引页从磁盘读取到缓冲池中。
定期地,当系统处于空闲状态或进行缓慢关闭时,清理操作会将更新后的索引页写入磁盘。相较于每个值立即写入磁盘,清理操作可以更高效地一次性写入一系列索引值的磁盘块。
Change Buffer的合并过程可能需要数小时,特别是在有大量受影响行和需要更新的二级索引的情况下。在此期间,会增加磁盘IO,可能会显著减慢磁盘受限的查询性能。Change Buffer的合并甚至可能在事务提交后、服务器关闭和重启后继续进行。
在内存中,Change Buffer占用缓冲池的一部分。在磁盘上,Change Buffer是系统表空间的一部分,用于缓冲数据库服务器关闭时的索引更改。
配置Change Buffering
Change Buffer中缓存的数据类型由innodb_change_buffering
变量控制。可以通过配置该变量来启用或禁用缓冲,还可以配置Change Buffer的最大大小。
下面是innodb_change_buffering
的可选值:
•all
:默认值,缓冲插入、删除标记和清理操作。•none
:不缓冲任何操作。•inserts
:只缓冲插入操作。•deletes
:只缓冲删除标记操作。•changes
:缓冲插入和删除标记操作。•`pur
ges`:缓冲后台进行的物理删除操作。
可以在MySQL选项文件(my.cnf或my.ini)中设置innodb_change_buffering
变量,也可以使用SET GLOBAL
语句动态更改该变量。更改该设置会影响新操作的缓冲,不会影响现有缓冲条目的合并过程。
配置Change Buffer的最大大小
innodb_change_buffer_max_size
变量允许配置Change Buffer的最大大小,以缓冲池总大小的百分比表示。默认情况下,innodb_change_buffer_max_size
设置为25,最大设置值为50。
在具有大量插入、更新和删除活动的MySQL服务器上,如果Change Buffer的合并无法跟上新的缓冲条目,导致Change Buffer达到其最大大小限制,可以考虑增加innodb_change_buffer_max_size
的值。
在用于报表的静态数据或Change Buffer消耗了太多与缓冲池共享的内存空间,导致数据页过早从缓冲池中驱逐时,可以考虑减小innodb_change_buffer_max_size
的值。
为了确定最佳配置,可以使用具有代表性负载的不同设置进行测试。innodb_change_buffer_max_size
变量是动态的,可以在不重新启动服务器的情况下修改该设置。
监控Change Buffer
以下是监控Change Buffer的几种选项:
•InnoDB标准监视器输出包含Change Buffer的状态信息。可以使用SHOW ENGINE INNODB STATUS
语句查看监视器数据。•信息模式中的INNODB_METRICS
表提供了Change Buffer的指标数据。可以使用以下查询语句查看Change Buffer的指标和描述:
SELECT NAME, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE '%ibuf%'\G
•信息模式中的INNODB_BUFFER_PAGE
表提供了有关缓冲池中每个页面的元数据,包括Change Buffer的索引和位图页面。可以使用以下查询语句对Change Buffer页面的数量进行估算:
SELECT (SELECT COUNT(*) FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE
WHERE 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互斥量等待的性能监控。可以使用以下查询语句查看Change Buffer的性能指标:
SELECT * FROM performance_schema.setup_instruments
WHERE NAME LIKE '%wait/synch/mutex/innodb/ibuf%';
通过合理配置和监控Change Buffer,可以减少磁盘IO,提高数据库的处理能力和响应性能。特别是对于I/O密集型的工作
负载,Change Buffer是一项重要的技术,值得深入研究和优化。
参考资料:
•MySQL 8.0 Reference Manual - 14.7 InnoDB Change Buffering•MySQL 8.0 Reference Manual - 15.18.7 InnoDB Change Buffer Status