MySQL 存储引擎 InnoDB 内存结构之更改缓冲区

这篇具有很好参考价值的文章主要介绍了MySQL 存储引擎 InnoDB 内存结构之更改缓冲区。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

更改缓冲区(Change Buffer)是一种特殊的数据结构,用于缓存不在缓冲池中的二级索引(secondary index)页的更改。可能来自于INSERTUPDATEDELETE操作(数据操作语言,DML)的缓冲更改,会在后续通过其他读操作将这些页加载到缓冲池时被合并。

MySQL 存储引擎 InnoDB 内存结构之更改缓冲区

与聚簇索引(clustered indexes)不同,二级索引通常是不唯一的,并且对二级索引的插入操作以相对随机的 顺序发生。同样地,删除和更新操作可能会影响索引树中不相邻的二级索引页。随后当受影响的页被其他操作读入缓冲池时,合并缓存中的更改可以避免从磁盘读取二级索引页到缓冲池中所需的大量随机访问I/O。

在系统大部分处于空闲状态或慢速关闭期间,会运行清理(purge)操作,定期将更新的索引页写入磁盘。与立即将每个值写入磁盘相比,清理操作可以更高效地将索引值批量写入磁盘。

当有大量受影响的行和需要更新的二级索引时,变更缓冲区的合并过程可能需要几个小时。在此期间,磁盘 I/O 会增加,这可能导致磁盘密集型查询明显减慢。提交事务之后,甚至在服务器关闭并重新启动之后,变更缓冲区合并也可能会持续发生(请参阅“第 14.22.2 节“强制 InnoDB 恢复”了解更多信息)。

在内存中,变更缓冲区占用了缓冲池的一部分空间。在磁盘上,变更缓冲区是系统表空间的一部分,当数据库服务器关闭时,索引更改将存储在其中。

变更缓冲区中缓存的数据类型由innodb_change_buffering变量控制。要了解更多信息,请参阅下文的”配置变更缓冲区“。您还可以配置最大变更缓冲区大小。要了解更多信息,请参阅下文的”配置最大变更缓冲区的大小“。

如果二级索引包含降序索引列,或者主键包含降序索引列,那么变更缓冲区不支持对该二级索引进行缓冲。

有关变更缓冲区的常见问题的解答,请参见第 A.16 节“ MySQL 5.7 FAQ: InnoDB 变更缓冲区”。

配置变更缓冲区

当对表执行INSERTUPDATEDELETE操作时,索引列的值(尤其是二级键的值)通常是无序的,需要大量的 I/O 操作来更新二级索引。变更缓冲区会在相关页面不在缓冲池中时缓存对二级索引条目的更改,从而通过不会立即从磁盘读取页面来避免昂贵的 I/O 操作。当页面被加载到缓冲池时,缓冲中的更改将合并,更新后的页面随后会刷新到磁盘。在服务器几乎空闲或慢速关闭时,InnoDB主线程会合并缓冲中的更改。

由于变更缓冲区可以减少磁盘读写操作,因此它对于 I/O 密集型的工作负载最为有价值。例如,变更缓冲可以给频繁进行 DML 操作(如批量插入)的应用程序带来好处。

但是,变更缓冲区占用了缓冲池的一部分空间,从而减少了可用于缓存数据页面的内存。如果工作集几乎完全适应缓冲池,或者您的表具有相对较少的二级索引,禁用变更缓冲可能是有益的。如果工作数据集完全适合缓冲池,变更缓冲不会增加额外开销,因为它仅适用于不在缓冲池中的页面。

innodb_change_buffering变量控制着InnoDB执行变更缓冲的程度。您可以启用或禁用插入操作、删除操作(最初将索引记录标记为删除时)和清理操作(当索引记录被物理删除时)的缓冲。更新操作是插入操作和删除操作的组合。innodb_change_buffering的默认值为all

  • all

    默认值:缓冲区插入,删除标记操作和清除。

  • none

    不缓冲任何操作。

  • inserts

    缓冲插入操作。

  • deletes

    缓冲删除标记操作。

  • changes

    缓冲插入和删除标记操作。

  • purges

    缓冲后台发生的物理删除操作。

您可以在 MySQL 选项文件(my.cnfmy.ini)中设置innodb_change_buffering参数,或使用SET GLOBAL语句动态更改它,该语句需要足够的权限来设置全局系统变量。参见第 5.1.8.1 节“系统变量特权”。更改设置会影响新操作的缓冲;现有缓冲条目的合并不受影响。

您可以在 MySQL 的选项文件(my.cnfmy.ini)中设置innodb_change_buffering参数,或者使用SET GLOBAL语句动态更改它,该语句需要足够的权限来设置全局系统变量。请参阅第 5.1.8.1 节,“系统变量特权”。更改设置会影响新操作的缓冲,但不会影响现有缓冲条目的合并。

配置最大变更缓冲区的大小

innodb_change_buffer_max_size参数允许按照缓冲池总大小的百分比配置变更缓冲区的最大大小。默认情况下,innodb_change_buffer_max_size设置为 25。最大设置值为 50。

在 MySQL 服务器上,如果存在大量的插入、更新和删除活动,并且变更缓冲区合并无法跟上新的变更缓冲条目的速度,导致变更缓冲区达到了其最大大小限制,那么可以考虑增加innodb_change_buffer_max_size

在 MySQL 服务器上,如果数据是用于报告目的而基本静态,或者如果变更缓冲区占用了与缓冲池共享的太多内存空间,导致页面过早地从缓冲池中淘汰,那么可以考虑减小innodb_change_buffer_max_size的值。

为了确定最佳配置,您可以使用一个代表性的工作负载来测试不同的设置。innodb_change_buffer_max_size参数是动态的,这意味着您可以在不重新启动服务器的情况下修改该设置。

监控变更缓冲区

以下选项可用于监控变更缓冲区:

  • InnoDB标准监视器输出包括变更缓冲区的状态信息。要查看监视器数据,请执行SHOW ENGINE INNODB STATUS语句。

    mysql> SHOW ENGINE INNODB STATUS\G
    

    变更缓冲区状态信息位于INSERT BUFFER AND ADAPTIVE HASH INDEX标题下方,并且显示类似以下内容:

    -------------------------------------
    INSERT BUFFER AND ADAPTIVE HASH INDEX
    -------------------------------------
    Ibuf: size 1, free list len 0, seg size 2, 0 merges
    merged operations:
     insert 0, delete mark 0, delete 0
    discarded operations:
     insert 0, delete mark 0, delete 0
    Hash table size 4425293, used cells 32, node heap has 1 buffer(s)
    13577.57 hash searches/s, 202.47 non-hash searches/s
    

    有关更多信息,请参阅第 14.18.3 节 “InnoDB 标准监视器和锁监视器输出”。

  • Information SchemaINNODB_METRICS表提供了InnoDB标准监视器输出中的大部分数据点以及其他数据点。要查看变更缓冲区指标及其描述,请执行以下查询:

    mysql> SELECT NAME, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE '%ibuf%'\G
    

    有关`INNODB_METRICS表用法情况的信息,请参见第 14.16.6 节“ InnoDB INFORMATION_SCHEMA Metrics Table”。

  • Information SchemaINNODB_BUFFER_PAGE表提供了关于缓冲池中每个页面的元数据,包括变更缓冲区索引和变更缓冲区位图页面。变更缓冲区页面通过PAGE_TYPE进行标识。IBUF_INDEX是变更缓冲区索引页的页面类型,IBUF_BITMAP是变更缓冲区位图页的页面类型。

    Waring:查询INNODB_BUFFER_PAGE表可能会带来显著的性能开销。为了避免影响性能,建议在测试实例上重现您要调查的问题,然后在测试实例上运行查询。

    例如,您可以查询INNODB_BUFFER_PAGE表,以确定IBUF_INDEXIBUF_BITMAP页面在总缓冲池页面中的近似比例。

    mysql> 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_pages | total_pages | change_buffer_page_percentage |
    +---------------------+-------------+-------------------------------+
    |                  25 |        8192 |                        0.3052 |
    +---------------------+-------------+-------------------------------+
    

    有关INNODB_BUFFER_PAGE表提供的其他数据的信息,请参阅第 24.4.2 节 “INFORMATION_SCHEMA INNODB_BUFFER_PAGE Table”。有关相关使用信息,请参阅第 14.16.5 节 “InnoDB INFORMATION_SCHEMA缓冲池表”。

  • Performance Schema为高级性能监控提供了变更缓冲区互斥锁等待检测。要查看变更缓冲区检测,请执行以下查询:

    mysql> SELECT * FROM performance_schema.setup_instruments
           WHERE NAME LIKE '%wait/synch/mutex/innodb/ibuf%';
    +-------------------------------------------------------+---------+-------+
    | NAME                                                  | ENABLED | TIMED |
    +-------------------------------------------------------+---------+-------+
    | wait/synch/mutex/innodb/ibuf_bitmap_mutex             | YES     | YES   |
    | wait/synch/mutex/innodb/ibuf_mutex                    | YES     | YES   |
    | wait/synch/mutex/innodb/ibuf_pessimistic_insert_mutex | YES     | YES   |
    +-------------------------------------------------------+---------+-------+
    

    有关监视InnoDB互斥锁等待的信息,请参阅第 14.17.2 节 “使用 Performance Schema 监视 InnoDB 互斥等待”。

注:原文来自 MySQL 5.7 官方文档,阅读 MySQL 中文文档时有些语句理解不顺畅,便结合中文文档使用 ChatGPT 进行了翻译,如有不正请指出。文章来源地址https://www.toymoban.com/news/detail-499190.html

到了这里,关于MySQL 存储引擎 InnoDB 内存结构之更改缓冲区的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL—MySQL的存储引擎之InnoDB

    存储引擎 说明 MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务 InnoDB 5.5版本后MySQL的默认数据库存储引擎,支持事务和行级锁,比MyISAM处理速度稍慢 ISAM MyISAM的前身,MySQL5.0以后不再默认安装 MRG_MyISAM 将多个表联合成一个表使用,在超大规模数据存储时很有用 Me

    2024年04月26日
    浏览(28)
  • MySQL 的 InnoDB 存储引擎简介

    MySQL 是世界上最流行的开源关系型数据库管理系统之一,而其中的存储引擎则是其关键组成部分之一。InnoDB 存储引擎在 MySQL 中扮演了重要角色,提供了许多高级功能和性能优化,适用于各种应用程序和工作负载。本文将深入介绍 InnoDB 存储引擎的各个方面,以帮助您更好地理

    2024年02月08日
    浏览(31)
  • 谈谈MySQL的InnoDB存储引擎

    大家好,我是易安! 今天我们谈一谈MySQL中InnoDB存储引擎。InnoDB存储引擎作为我们最常用到的存储引擎之一,充分熟悉它的的实现和运行原理,有助于我们更好地创建和维护数据库表。 InnoDB主要包括了内存池、后台线程以及存储文件。内存池又是由多个内存块组成的,主要包

    2024年02月03日
    浏览(27)
  • 【MYSQL】存储引擎MyISAM和InnoDB

    查看MySQL提供所有的存储引擎 mysql show engines; mysql常用引擎包括:MYISAM、Innodb、Memory、MERGE 1、MYISAM:全表锁,拥有较高的执行速度,不支持事务,不支持外键,并发性能差,占用空间相对较小,对事务完整性没有要求,以select、insert为主的应用基本上可以使用这引擎 2、Innod

    2024年01月18日
    浏览(30)
  • MySQL高级10-InnoDB引擎存储架构

    表空间(Tablespace):一个mysql实例,及一个数据库实例,可以对应多个表空间(ibd文件),用于存储记录,索引等数据。 段(Segment):分为数据段(Leaf node segment)、索引段(Non-leaf node segment)、回滚段(Rollback segment),InnoDB是索引组织表,数据段就是B+树的叶子节点(Leaf node segment),

    2024年02月08日
    浏览(29)
  • mysql--InnoDB存储引擎--架构和事务

    MySQL进阶篇 InnoDB 逻辑存储单元主层级关系图: 1、表空间 表空间是InnoDB存储引擎逻辑结构的最高层, 如果用户启用了参数 innodb_file_per_table(在 8.0版本中默认开启) ,则每张表都会有一个表空间(xxx.ibd),一个mysql实例可以对应多个表空间,用于存储记录、索引等数据。 2、段

    2024年02月14日
    浏览(32)
  • 【MySQL】 深入了解InnoDB存储引擎的限制

    目录 列数限制 索引数限制 InnoDB的行格式和索引限制 示例和注意事项 **页大小对索引键前缀长度的影响 **对全列索引键的限制 多列索引限制 行大小限制 InnoDB log限制 表空间大小限制 表数量限制 操作系统限制 文件大小和日志文件大小 文件层级限制 随着数据库技术的不断发

    2024年01月24日
    浏览(33)
  • MySQL之深入InnoDB存储引擎——Checkpoint机制

    由于页的操作首先都是在缓冲池中完成的,那么如果一条DML语句改变了页中的记录,那么此时页就是脏的,即缓冲池中页的版本要比磁盘的新。那么数据库需要将新版本的页刷新到磁盘。倘若每次一个页发生变化就刷新,那么开销会很大,若热点数据集中在某几个页中,那么

    2024年02月15日
    浏览(30)
  • MySQL存储引擎InnoDB和MyISAM的区别?

    InnoDB和MyISAM是MySQL数据库两种常见的存储引擎,它们在性能、事务支持等方面有一些重要的区别。以下是它们的一些主要区别: 事务支持: InnoDB: 支持事务,具有ACID(原子性、一致性、隔离性、持久性)特性,适用于需要事务支持的应用,如银行、电商等。 MyISAM: 不支持

    2024年02月03日
    浏览(37)
  • MySQL高级篇(存储引擎InnoDB、MyISAM、Memory)

    目录 1、存储引擎简介 1.1、查询建表语句,默认存储引擎:InnoDB 1.2、查看当前数据库支持的存储引擎 1.3、创建表,并指定存储引擎 2、 存储引擎-InnoDB介绍 2.1、存储引擎特点  3、MyISAM存储引擎  4、Memory存储引擎  5、InnoDB、MyISAM、Memory的区别  6、存储引擎的选择 介绍:In

    2024年04月11日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包