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 更改缓冲区

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. 哪里可以找到关于更改缓冲的更多信息?
(No translation needed, as this is a HTML structure definition and doesn't contain any translatable text.) Here is the translated HTML fragment: 翻译后: 变为: 翻译后: 变为:

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 节,“Change Buffer”

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节,“更改缓冲区”

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

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

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

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