MySQL-InnoDB-Change Buffer

Change Buffer(insert buffer)

change buffer是一种特殊的数据结构,当缓冲池(buffer pool)中没有辅助索引页时,它会缓存对这些页的更改。缓冲的更改可能来自 INSERT UPDATE DELETE操作(DML),稍后当其他读操作将页面加载到缓冲池中时,将合并这些更改。

MySQL-InnoDB-Change Buffer_第1张图片

聚集索引不同的是,辅助索引通常不是唯一的,并且对辅助索引的插入以相对随机的顺序发生。类似地,删除和更新可能会影响不在索引树中邻接位置的辅助索引页。当受影响的页面被其他操作读入缓冲池时,在稍后合并缓存的更改,可以避免大量的随机访问I/O,因为从磁盘将辅助索引页面读入缓冲池需要这样做。

Purge操作(在系统基本空闲或缓慢关闭期间运行)定期将更新的索引页写入磁盘。Purge操作可以更有效地为一系列索引值写入磁盘块,而不是立即将每个值写入磁盘。

当有大量受影响的行和辅助索引要更新时,更改缓冲区合并可能需要几个小时。在此期间,磁盘I/O会增加,这可能大大降低磁盘的查询。change buffer合并也可能在事务提交后继续发生,甚至在服务器关闭和重启后(参见章节15.21.3,“强制InnoDB恢复”了解更多信息)。

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

缓存在change buffer中的数据类型由 innodb_change_buffering 变量控制。有关更多信息,请参见配置change buffer。您还可以配置最大更改缓冲区大小。有关更多信息,请参见配置change buffer最大大小

如果辅助索引包含降序索引列,或者如果主键包含降序索引列,则不支持change buffer。

有关change buffer的常见问题的答案,请参见A.16节,“MySQL 8.0常见问题:InnoDB change buffer”

配置change buffer

当在表上执行 INSERT UPDATE DELETE 操作时,索引列的值(特别是辅助索引的值)通常是无序的,需要大量的I/O来更新辅助索引。当相关的不在缓冲池中时,change buffer缓存更改为辅助索引项,从而通过不立即从磁盘读入页来避免昂贵的I/O操作。change buffer中的更改的合并,发生在将页面加载到缓冲池时,之后再将更新的页面刷新到磁盘。 InnoDB 主线程在服务器接近空闲和慢关机期间合并缓冲的更改。

因为它可以降低的磁盘读写,change buffer对于基于I/O的工作负载最有价值;例如,具有大量DML操作(如批量插入)的应用程序可以从change buffe中受益。

然而,change buffer占用了缓冲池的一部分,减少了可用来缓存数据页的内存。如果工作数据集和缓冲池差不多适配,或者表的辅助索引相对较少,那么禁用更改缓冲可能会很有用。如果工作数据集完全适合缓冲池,则更改缓冲不会带来额外的开销,因为它只应用于不在缓冲池中的页面。

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

innodb_change_buffering 有以下值:

  • all

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

  • none

    不要缓冲任何操作。

  • inserts

    缓冲插入操作。

  • deletes

    缓冲delete-marking操作。

  • changes

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

  • purges

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

你可以在MySQL选项文件( my.cnf my.ini )中设置 innodb_change_buffering 变量,或者用 set GLOBAL 语句)动态更改它,它需要足够的权限来设置全局系统变量。参见第5.1.9.1节,“系统变量特权”

更改设置会影响新操作的缓冲;现有缓冲项的合并不受影响。

配置Change Buffer的最大大小

innodb_change_buffer_max_size 变量允许配置更改缓冲区的最大大小(缓冲池总大小的百分比)。默认情况下, innodb_change_buffer_max_size 设置为25%。最大设置为50%。

在有大量插入、更新和删除活动的MySQL服务器上,change buffer合并速度跟不上新增的更改速度,导致更改缓冲区达到其最大大小限制,请考虑增加 innodb_change_buffer_max_size

在一个用于报告静态数据的MySQL服务器上,或者change 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

    更多信息请参见第15.17.3节,“InnoDB标准监视器和锁监视器输出”

  • INFORMATION_SCHEMA.INNODB_METRICS 表提供了 InnoDB Standard Monitor输出中的大部分数据点以及其他数据点。要查看更改缓冲区指标和每个指标的描述,查询语句如下:

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

    有关 INNODB_METRICS 表使用信息,请参见第15.15.6节," InnoDB INFORMATION_SCHEMA度量表"

  • INFORMATION_SCHEMA.INNODB_BUFFER_PAGE 表提供了关于缓冲池中每个页面的元数据,包括更改缓冲区索引和更改缓冲区位图页面。更改缓冲页由 PAGE_TYPE 标识。 IBUF_INDEX 是更改缓冲区索引页的页类型, IBUF_BITMAP 是更改缓冲区位图页的页类型。

    警告:

    查询 INNODB_BUFFER_PAGE 表可能会带来巨大的性能开销。为了避免影响性能,请在测试实例上再现您想要研究的问题,并在测试实例上运行您的查询。

    例如,您可以查询 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 表提供的其他数据的信息,请参见第26.4.2节,“INNODB_BUFFER_PAGE表的信息”。有关使用信息,请参见第15.15.5节," InnoDB INFORMATION_SCHEMA缓冲池表"

  • Performance Schema为高级性能监视提供更改缓冲区互斥锁等待工具。要查看change buffer检测,查询语句如下:

    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 互斥锁等待的信息,请参见第15.16.2节,“使用性能模式监视InnoDB互斥锁等待”

你可能感兴趣的:(MySQL-InnoDB-Change Buffer)