Change Buffer:提升InnoDB性能的关键技术

摘要: 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的指标和描述:

sql 复制代码
SELECT NAME, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE '%ibuf%'\G

•信息模式中的INNODB_BUFFER_PAGE表提供了有关缓冲池中每个页面的元数据,包括Change Buffer的索引和位图页面。可以使用以下查询语句对Change Buffer页面的数量进行估算:

sql 复制代码
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的性能指标:

sql 复制代码
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

相关推荐
爱读源码的大都督4 小时前
为什么有了HTTP,还需要gPRC?
java·后端·架构
Lucky_Turtle4 小时前
【Java Xml】Apache Commons Digester3解析
xml·java·apache
聪明的笨猪猪5 小时前
Java Redis “缓存设计”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
FIavor.5 小时前
我发送给Apifox是http://localhost:9002/goods/getByUserName?name=张三 为什么会是500哪里错了?
java·服务器·网络协议·http
ID_180079054735 小时前
京东获取整站实时商品详情数据|商品标题|数据分析提取教程
java·开发语言
微露清风5 小时前
系统性学习C++-第五讲-内存管理
java·c++·学习
计算机毕业设计木哥5 小时前
计算机毕业设计选题推荐:基于SpringBoot和Vue的快递物流仓库管理系统【源码+文档+调试】
java·vue.js·spring boot·后端·课程设计
235165 小时前
【LeetCode】146. LRU 缓存
java·后端·算法·leetcode·链表·缓存·职场和发展
聪明的笨猪猪6 小时前
Java Redis “运维”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
FIavor.6 小时前
怎么办这是Apifox里执行http://localhost:9002/goods/getByUserName?name=“张三“为什么我改了还是500?
java·网络·网络协议·http