A.16 MySQL 8.4 常见问题解答:InnoDB 更改缓冲区
- A.16.1. 哪些类型的操作会修改辅助索引并导致更改缓冲?
- 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. | 哪些类型的操作会修改辅助索引并导致更改缓冲? |
|
INSERT 、UPDATE 和 DELETE 操作可以修改辅助索引。如果受影响的索引页不在缓冲池中,则更改可以缓冲在更改缓冲区中。 |
A.16.2. | InnoDB 更改缓冲区的好处是什么?
|
| 当辅助索引页不在缓冲池中时缓冲辅助索引更改可以避免昂贵的随机访问 I/O 操作,否则需要立即从磁盘读取受影响的索引页。缓冲的更改可以在以后批量应用,因为页面是由其他读取操作读入缓冲池的。 |
A.16.3. | 更改缓冲区是否支持其他类型的索引? |
| 否。更改缓冲区仅支持辅助索引。不支持聚集索引、全文索引和空间索引。全文索引有自己的缓存机制。 |
A.16.4. | InnoDB 为更改缓冲区使用多少空间?
|
| 在 MySQL 5.6 中引入 innodb_change_buffer_max_size 配置选项之前,系统表空间中磁盘上更改缓冲区的最大大小是 InnoDB 缓冲池大小的 1/3。 在 MySQL 5.6 及更高版本中,innodb_change_buffer_max_size 配置选项将更改缓冲区的最大大小定义为总缓冲池大小的百分比。默认情况下,innodb_change_buffer_max_size 设置为 25。最大设置为 50。
如果操作会导致磁盘上的更改缓冲区超过定义的限制,InnoDB 不会缓冲该操作。 更改缓冲区页面不需要持久保留在缓冲池中,并且可能会被 LRU 操作驱逐。 |
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
相关数据点包括
有关监控更改缓冲区状态的信息,请参阅 第 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 活动修改辅助索引页时,或者当有大量辅助索引定期被 DML 活动更改时,应该使用更改缓冲区。 |
A.16.9. | 何时不应该使用更改缓冲区? |
| 如果整个数据集都适合 InnoDB 缓冲池,或者辅助索引相对较少,或者正在使用固态存储(随机读取速度与顺序读取速度差不多)时,您可以考虑禁用更改缓冲区。在进行配置更改之前,建议您使用代表性工作负载运行测试,以确定禁用更改缓冲区是否会带来任何好处。 |
A.16.10. | 在哪里可以找到有关更改缓冲区的其他信息? |
| 请参阅 第 17.5.2 节,“更改缓冲区”。 |