Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


17.5.2 更改缓冲区

更改缓冲区是一种特殊的数据结构,用于缓存对次要索引页的变化,当这些页不在缓冲池中。缓存的更改可能来自INSERTUPDATEDELETE操作(DML),这些更改将在页面被其他读操作加载到缓冲池时合并。

图17.3 更改缓冲区

Content is described in the surrounding text.

聚集索引不同,次要索引通常是非唯一的,插入次要索引发生在随机顺序中。类似地,删除和更新可能影响不相邻的索引页。合并缓存更改,以便在其他操作读取页面时将其写回磁盘,可以避免大量随机I/O操作,这些操作将从磁盘读取索引页到缓冲池。

系统处于闲置状态或在慢速关机时,定期运行的 purge 操作将将更新后的索引页写回磁盘。purge 操作可以以更高效率地将一系列索引值写回磁盘,而不是每个值都立即写回磁盘。

更改缓冲区合并可能需要几个小时,当有许多受影响的行和多个次要索引需要更新时。在这个时间内,磁盘I/O增加,这可能会导致磁盘瓶颈查询的明显 slowdown。更改缓冲区合并也可能在事务提交后继续发生,即使是在服务器关闭和重新启动后(请参阅第17.20.3节,“强制InnoDB恢复”以获取更多信息)。

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

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

如果索引包含降序索引列或主键包括降序索引列,则不支持对次要索引的更改缓冲区。

关于更改缓冲区的常见问题,请参阅第A.16节,“MySQL 8.4 FAQ:InnoDB更改缓冲区”

配置更改缓冲区

当对表执行INSERTUPDATEDELETE操作时,索引列的值(特别是次要键的值)通常处于无序状态,这需要大量I/O来更新次要索引。 更改缓冲区将次要索引条目的更改缓存在相关页面不在缓冲池时避免了昂贵的I/O操作,不立即从磁盘读取页面。缓存的更改将在页面加载到缓冲池时合并,并且更新后的页面后续将被flush到磁盘。InnoDB主线程在服务器接近空闲时合并缓存的更改,以及在慢速关闭期间。

由于可以减少磁盘读写操作,故更改缓冲区对I/O受限的工作负载最为有价值;例如,对于具有高DML操作 volumed应用程序(如批量插入)来说,更改缓冲区非常有价值。

然而,更改缓冲区占用了缓冲池的一部分,减少了可用于缓存数据页面的内存。如果工作集几乎可以在缓冲池中容纳,也就是说您的表具有相对较少的次要索引,那么可能需要禁用更改缓冲区。如果工作数据集完全可以在缓冲池中容纳,那么更改缓冲区不再增加额外开销,因为它只应用于不在缓冲池中的页面。

innodb_change_buffering 变量控制 InnoDB 执行更改缓冲区的程度。您可以启用或禁用插入、删除操作(当索引记录首次标记为删除时)和 purge 操作(当索引记录物理删除时)的缓冲。更新操作是插入和删除操作的组合。默认的 innodb_change_buffering 值为 none,并且允许的值在 innodb_change_buffering 文档中描述。

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

配置更改缓冲区最大大小

变量innodb_change_buffer_max_size允许配置更改缓冲区的最大大小,以百分比形式设置总buffer池的大小。默认情况下,innodb_change_buffer_max_size被设置为25%. 最大设置是50%

在MySQL服务器上执行大量插入、更新和删除操作,如果更改缓冲区合并不能跟上新的更改缓冲区条目,导致更改缓冲区达到最大大小限制时,考虑增加innodb_change_buffer_max_size

在MySQL服务器上执行静态数据报告或更改缓冲区占用太多内存空间,导致buffer池中的页面比期望的时间早些被淘汰时,考虑减少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

    更多信息,请见第17.17.3节,“InnoDB Standard Monitor and Lock Monitor Output”

  • 信息架构INNODB_METRICS表提供了大多数InnoDB标准监控输出中的数据点,plus其他数据点。要查看更改缓冲区指标和每个指标的描述,请执行以下查询:

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

    请见第17.15.6节,“InnoDB INFORMATION_SCHEMA Metrics Table”

  • 信息架构INNODB_BUFFER_PAGE表提供了缓冲池中的每个页面的元数据,包括更改缓冲区索引和更改缓冲区位图页。更改缓冲区页由PAGE_ TYPE标识。IBUF_INDEX是更改缓冲区索引页的页面类型,而IBUF_BITMAP是更改缓冲区位图页的页面类型。

    Warning

    查询INNODB_BUFFER_PAGE 表可能会引入significant性能开销。为了避免影响性能,请在测试实例中复制您想调查的问题,并在测试实例上运行您的查询。

    例如,您可以查询INNODB_BUFFER_PAGE 表以确定IBUF_INDEX和IBUF_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 表提供的其他数据,请见第28.4.2节,“INNODB_ BUFFER_PAGE 表”。关于相关用法信息,请见第17.15.5节,“InnoDB INFORMATION_SCHEMA Buffer Pool Tables”

  • 性能Schema提供了更高级的性能监控功能,包括change buffer mutex wait instrumentation。要查看change buffer instrumentation,请执行以下查询:

    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互斥锁等待的信息,请见第17.16.2节,“使用性能_schema监控 InnoDB 互斥锁等待”