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

与聚簇索引(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 进行了翻译,如有不正请指出。

MySQL 存储引擎 InnoDB 内存结构之更改缓冲区的更多相关文章

  1. 常用Mysql存储引擎--InnoDB和MyISAM简单总结

    常用Mysql存储引擎--InnoDB和MyISAM简单总结 2013-04-19 10:21:52|  分类: CCST|举报|字号 订阅     MySQL服务器采用了模块化风格,各部分之间保持相 ...

  2. MySQL存储引擎InnoDB,MyISAM

    MySQL存储引擎InnoDB,MyISAM1.区别:(1)InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语 ...

  3. MySQL存储引擎InnoDB与Myisam

    InnoDB与Myisam的六大区别 InnoDB与Myisam的六大区别 MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始,扩展名 ...

  4. 浅谈MySQL存储引擎-InnoDB&MyISAM

    存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式是不同的.每一种存储引擎都有它的优势和劣势,本文只讨论最常见 ...

  5. mysql 存储引擎 InnoDB 与 MyISAM 的区别和选择

    http://www.blogjava.net/jiangshachina/archive/2009/05/31/279288.html     酷壳 - MySQL: InnoDB 还是 MyISA ...

  6. MySQL存储引擎InnoDB大量数据下的问题

    MySQL如果只有MyISAM一个引擎的话,那你们黑真的也有道理,但问题是InnoDB现在已经是MySQL默认的引擎,而且这个引擎综合能力很强,能用好这个引擎其实就已经能解决大多数需要数据库的业务逻辑 ...

  7. mysql存储引擎InnoDB详解,从底层看清InnoDB数据结构

    InnoDB一个支持事务安全的存储引擎,同时也是mysql的默认存储引擎.本文主要从数据结构的角度,详细介绍InnoDB行记录格式和数据页的实现原理,从底层看清InnoDB存储引擎. 本文主要内容是根 ...

  8. MySQL存储引擎 InnoDB/ MyISAM/ MERGE/ BDB 的区别

    MyISAM:默认的MySQL插件式存储引擎,它是在Web.数据仓储和其他应用环境下最常使用的存储引擎之一.注意,通过更改 STORAGE_ENGINE 配置变量,能够方便地更改MySQL服务器的默认 ...

  9. MySQL存储引擎Innodb和MyISAM对比总结

    Innodb引擎 InnoDB是一个事务型的存储引擎,设计目标是处理大数量数据时提供高性能的服务,它在运行时会在内存中建立缓冲池,用于缓冲数据和索引. Innodb引擎优点 1.支持事务处理.ACID ...

  10. MySQL存储引擎InnoDB与MyISAM的区别

    一.比较 事务:InnoDB是事务型的,可以使用Commit和Rollback语句. 并发:MyISAM只支持表级锁,InnoDB还支持行级锁. 外键:InnoDB支持外键. 备份:InnoDB支持在 ...

随机推荐

  1. Java 异常处理:使用和思考

    概念 异常处理的概念起源于早期的编程语言,如 LISP.PL/I 和 CLU.这些编程语言首次引入了异常处理机制,以便在程序执行过程中检测和处理错误情况.异常处理机制随后在 Ada.Modula-3. ...

  2. wpf RelativeSource绑定

    RelativeSource有四种类型 Self FindAncestor TemplatedParent PreviousData a.Self Self用于绑定源和绑定目标相同的场景中.对象的一个 ...

  3. windows如何拉取一个文件夹下的所有文件名

    问题描述:遇到一个问题,是说一个文件夹下的文件太多了,如何去批量的拉去文件名呢,今天用CMD+DIR的方式拉取 1.文件目录也很深,就从文件导航栏进入CMD窗口 2.在当前目录中输入cmd,然后回车 ...

  4. 使用 LoRA 和 Hugging Face 高效训练大语言模型

    在本文中,我们将展示如何使用 大语言模型低秩适配 (Low-Rank Adaptation of Large Language Models,LoRA) 技术在单 GPU 上微调 110 亿参数的 F ...

  5. 深入理解 python 虚拟机:字节码教程(3)——深入剖析循环实现原理

    深入理解 python 虚拟机:字节码教程(3)--深入剖析循环实现原理 在本篇文章当中主要给大家介绍 cpython 当中跟循环相关的字节码,这部分字节码相比起其他字节码来说相对复杂一点,通过分析这 ...

  6. Spring源码系列(补充):详解ApplicationContext

    前言 在之前的文章中,我们已经对Spring源码中的一些核心概念进行了分析.由于篇幅限制,我们并没有详细解释ApplicationContext类所继承的父接口及其作用.因此,本文将单独为Applic ...

  7. mysql 自动挂掉

    今天在看后台的时候,发现登录不上去了,登录页面是可以访问,但是就是登录不上去,上了后台看了一下,说mysql连接超时,然后我重启了一下服务器,发现依然报mysql的错误,我尝试连接mysql, 报了一 ...

  8. intellij IDEA安装JDBC报错 No suitable driver found for jdbc:mysql://localhost:3306

    项目场景: 本地尝试使用intellij IDEA加载JDBC连接MySQL,尝试实现增删改查,本来想做一个小Demo. 问题描述 报错: java.lang.ClassNotFoundExcepti ...

  9. Jupyter Notebook(或vscode插件) 一个cell有多个输出

    方法一 在文件的开头加上如下代码,该方法仅对当前文件有效 from IPython.core.interativeshell import InteractiveShell InteractiveSh ...

  10. 【HTML-CSS】div中加入icon后input标签占用不满问题

    做登录表单时遇到了一个宽度控制不好的问题,放入图标后,input框总是无法正确的填满剩余空间(尺寸过大/过小) 原因是input元素和父元素div宽度都写死的问题 把父元素的高度删除,宽度改成max- ...