Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  MySQL 8.3 Frequently Asked Questions  /  MySQL 8.3 FAQ: InnoDB Change Buffer

A.16 MySQL 8.3 FAQ: InnoDB Change Buffer

A.16.1. secondary indexes什么类型的操作会修改并导致更改缓冲?
A.16.2. InnoDB更改缓冲的优点是什么?
A.16.3. 更改缓冲是否支持其他类型的索引?
A.16.4. InnoDB为更改缓冲分配了多少空间?
A.16.5. 如何确定当前更改缓冲的大小?
A.16.6. 更改缓冲何时合并?
A.16.7. 更改缓冲何时被刷新?
A.16.8. 何时应该使用更改缓冲?
A.16.9. 何时不应该使用更改缓冲?
A.16.10. 哪里可以找到关于更改缓冲的更多信息?

A.16.1.

什么类型的操作修改辅助索引并导致更改缓冲?

INSERTUPDATEDELETE 操作可以修改辅助索引。如果受影响的索引页不在缓冲池中,则更改可以缓存在更改缓冲区中。

A.16.2.

InnoDB 更改缓冲的优点是什么?

缓存辅助索引更改时,如果辅助索引页不在缓冲池中,可以避免昂贵的随机访问I/O操作,这些操作需要立即从磁盘读取受影响的索引页。缓存的更改可以稍后批量应用,当页面被其他读取操作读入缓冲池时。

A.16.3.

更改缓冲是否支持其他类型的索引?

否。更改缓冲仅支持辅助索引。聚簇索引、全文索引和空间索引不受支持。全文索引具有自己的缓存机制。

A.16.4.

InnoDB 为更改缓冲使用多少空间?

在 MySQL 5.6 之前,系统表空间中的更改缓冲的最大大小是 InnoDB 缓冲池大小的 1/3。

在 MySQL 5.6 及更高版本中,innodb_change_buffer_max_size 配置选项定义了更改缓冲的最大大小作为总缓冲池大小的百分比。默认情况下,innodb_change_buffer_max_size 设置为 25。最大设置为 50。

InnoDB 不会缓存操作,如果它会使磁盘更改缓冲超过定义的限制。

更改缓冲页面不需要保留在缓冲池中,可以被 LRU 操作 evict。

A.16.5.

如何确定当前的更改缓冲大小?

当前的更改缓冲大小由 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

相关数据点包括:

  • size:更改缓冲中使用的页面数。更改缓冲大小等于 seg size - (1 + free list len)1 + 值表示更改缓冲头页。

  • seg size:更改缓冲的大小,以页面为单位。

有关监控更改缓冲状态的信息,请参阅 第 17.5.2 节,“更改缓冲”

A.16.6.

何时发生更改缓冲合并?

  • 当一页被读入缓冲池时,缓冲更改将在读取完成之前合并,然后将页面提供给用户。

  • 更改缓冲区合并作为背景任务执行。innodb_io_capacity 参数设置了 InnoDB 背景任务(如合并数据从更改缓冲区)执行的 I/O 活动的上限。

  • 在崩溃恢复期间执行更改缓冲区合并。从更改缓冲区(在系统表空间中)将更改应用于辅助索引的叶页,而这些叶页被读入缓冲池。

  • 更改缓冲区是完全持久的,可以在系统崩溃后幸存。重新启动后,更改缓冲区合并操作将作为正常操作的一部分恢复。

  • 可以使用 --innodb-fast-shutdown=0 强制执行完整的更改缓冲区合并作为慢服务器关闭的一部分。

A.16.7.

更改缓冲区何时刷新?

更新的页面由与刷新缓冲池中的其他页面相同的刷新机制刷新。

A.16.8.

何时使用更改缓冲区?

更改缓冲区是一个旨在减少随机 I/O 到辅助索引的功能,因为这些索引变得越来越大,不再适合 InnoDB 缓冲池。通常,在整个数据集不适合缓冲池、存在大量 DML 活动修改辅助索引页或存在许多经常更改的辅助索引时,应该使用更改缓冲区。

A.16.9.

何时不使用更改缓冲区?

如果整个数据集适合 InnoDB 缓冲池、只有少量辅助索引或使用固态存储(其中随机读取速度与顺序读取速度相似),那么您可能需要禁用更改缓冲区。在进行配置更改之前,建议使用代表性工作负载运行测试,以确定禁用更改缓冲区是否提供任何益处。

A.16.10.

哪里可以找到关于更改缓冲区的更多信息?

请参阅 第 17.5.2 节,“更改缓冲区”