A.16 MySQL 9.0 常见问题解答: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 节,“更改缓冲区”。 |