本文介绍: 当其他操作将受影响的页面读入缓冲池时,稍后合并缓存的更改可以避免从磁盘将辅助索引页读入缓冲池所需的大量随机访问 I/O。这些情况可能会将经常使用的页面推送到旧的子列表,在那里它们会被驱逐。增加百分比会使旧子列表变大,从而使该子列表中的页面移动到尾部需要更长的时间,这增加了这些页面被再次访问并成为年轻页面的可能性。旧子列表中的页面命中会导致页面移动到新子列表,但新子列表中的页面命中只会在距离头部一定距离时才会导致页面移动到列表的头部。当页面加载到缓冲池中时,缓冲的更改将被合并,更新的页面稍后会刷新到磁盘。

  官网地址:MySQL :: MySQL 5.7 Reference Manual :: 14.5 InnoDB In-Memory Structures

欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯.

 

MySQL 5.7 参考手册  /    /  更改缓冲区

14.5.2 更改缓冲区

更改缓冲区是一种特殊的数据结构, 当辅助索引页不在 缓冲池中时,它会缓存这些页的更改。缓冲的更改可能由 INSERT、 UPDATE、 或 DELETE操作 (DML) 导致,稍后当其他读取操作将页面加载到缓冲池中时,这些更改将被合并。

图 14.3 更改缓冲区

 

图片来自于官网原文

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

系统大部分空闲时或缓慢关闭期间运行的清除操作会定期将更新的索引页写入磁盘。与立即将每个值写入磁盘相比,清除操作可以更有效地写入一系列索引值的磁盘块。

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

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

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

如果索引包含降序索引列或主键包含降序索引列,则辅助索引不支持更改缓冲。

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

配置变更缓冲

当对表执行INSERT、 UPDATE、 和 DELETE操作时,索引列的值(特别是辅助键的值)通常处于未排序的顺序,需要大量 I/O 来更新辅助索引。当相关 页面不在 缓冲池中时,更改 缓冲区会缓存对辅助索引条目的更改,从而通过不立即从磁盘读取页面来避免昂贵的 I/O 操作。当页面加载到缓冲池中时,缓冲的更改将被合并,更新的页面稍后会刷新到磁盘。这InnoDB当服务器几乎空闲时以及 缓慢关闭期间,主线程合并缓冲的更改。

因为它可以减少磁盘读取和写入,所以更改缓冲对于 I/O 密集型工作负载最有价值;例如,具有大量 DML 操作(例如批量插入)的应用程序可以从更改缓冲中受益。

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

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

允许的innodb_change_buffering 值包括:

  • all

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

  • none

    不要缓冲任何操作。

  • inserts

    缓冲区插入操作。

  • deletes

    缓冲区删除标记操作。

  • changes

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

  • purges

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

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

配置更改缓冲区最大大小

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

考虑 innodb_change_buffer_max_size在具有大量插入、更新和删除活动的 MySQL 服务器上进行增加,其中更改缓冲区合并与新的更改缓冲区条目保持同步,导致更改缓冲区达到其最大大小限制。

innodb_change_buffer_max_size考虑在具有用于报告的静态数据的 MySQL 服务器上 减少 ,或者如果更改缓冲区消耗了太多与缓冲池共享的内存空间,导致页面比预期更快地从缓冲池中老化。

使用代表性工作负载测试不同的设置以确定最佳配置。该 innodb_change_buffer_max_size 变量是动态的,允许在不重新启动服务器的情况下修改设置。

监控变更缓冲区

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

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

    mysql> SHOW ENGINE INNODB STATUSG

    更改缓冲区状态信息位于 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 标准监视器和锁定监视器输出”

  • 信息架构 INNODB_METRICS表提供了标准监视器输出中的大部分数据点InnoDB 以及其他数据点。要查看更改缓冲区指标及其描述,请发出以下查询:

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

    有关INNODB_METRICS表使用信息,请参阅 第 14.16.6 节 “InnoDB 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表提供的其他数据的信息,请参阅 第 24.4.2 节 “INFORMATION_SCHEMA INNODB_BUFFER_PAGE 表”。有关相关使用信息,请参阅 第 14.16.5 节,“InnoDB INFORMATION_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 节,“使用性能模式监视 InnoDB 互斥等待”

MySQL 5.7 参考手册  /    /  自适应哈希索引

14.5.3 自适应哈希索引

自适应哈希索引能够InnoDB在具有适当的工作负载组合和足够的缓冲池内存的系统上执行更像内存数据库的操作,而不会牺牲事务功能或可靠性。自适应哈希索引由 innodb_adaptive_hash_index 变量启用,或在服务器启动时由 关闭 --skip-innodb-adaptive-hash-index

根据观察到的搜索模式,使用索引键的前缀构建哈希索引。前缀可以是任意长度,并且可能只有B树中的某些值出现在哈希索引中。哈希索引是根据需要为经常访问的索引页构建的。

如果表几乎完全适合主内存,则哈希索引可以通过直接查找任何元素、将索引值转换为某种指针来加速查询。 InnoDB有一个监视索引搜索的机制。如果InnoDB注意到查询可以从构建哈希索引中受益,它会自动执行此操作。

对于某些工作负载,哈希索引查找所带来的加速远远超过了监视索引查找和维护哈希索引结构的额外工作。在繁重的工作负载(例如多个并发联接)下,对自适应哈希索引的访问有时会成为争用的根源。LIKE使用运算符和通配符的查询 % 往往也不会受益。对于无法从自适应哈希索引中受益的工作负载,将其关闭可以减少不必要的性能开销。由于很难提前预测自适应哈希索引功能是否适合特定系统和工作负载,因此请考虑在启用和禁用该功能的情况下运行基准测试。

在MySQL 5.7中,自适应哈希索引功能是分区的。每个索引都绑定到一个特定的分区,并且每个分区都由单独的锁存器保护。分区由变量控制 innodb_adaptive_hash_index_parts 。在早期版本中,自适应哈希索引功能由单个锁存器保护,这在繁重的工作负载下可能成为争论点。该 innodb_adaptive_hash_index_parts 变量默认设置为 8。最大设置为 512。

SEMAPHORES您可以在输出部分 监视自适应哈希索引的使用和争用 SHOW ENGINE INNODB STATUS。如果有大量线程等待在 中创建的 rw-latches btr0sea.c,请考虑增加自适应哈希索引分区的数量或禁用自适应哈希索引。

有关哈希索引的性能特征的信息,请参阅第 8.3.8 节“B 树和哈希索引的比较”

MySQL 5.7 参考手册  /    /  日志缓冲区

14.5.4 日志缓冲区

日志缓冲区是保存要写入磁盘上日志文件的数据的内存区域。日志缓冲区大小由变量定义 innodb_log_buffer_size。默认大小为 16MB。日志缓冲区的内容会定期刷新到磁盘。大型日志缓冲区允许大型事务运行,而无需在事务提交之前将重做日志数据写入磁盘。因此,如果您有更新、插入或删除许多行的事务,则增加日志缓冲区的大小可以节省磁盘 I/O。

该 innodb_flush_log_at_trx_commit 变量控制如何将日志缓冲区的内容写入并刷新到磁盘。该 innodb_flush_log_at_timeout 变量控制日志刷新频率。

有关相关信息,请参阅 内存配置和 第 8.5.4 节 “优化 InnoDB 重做日志记录”

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注