A.16 MySQL 5.7 常见问题解答:InnoDB 更改缓冲区


**A.16.1. **
哪些类型的操作会修改二级索引并导致更改缓冲?
INSERTUPDATEDELETE操作可以修改辅助索引。如果受影响的索引页不在缓冲池中,则可以将更改缓冲在更改缓冲区中。

**A.16.2. **
InnoDB更改缓冲区有什么好处?
当二级索引页不在缓冲池中时,对二级索引的更改进行缓冲可以避免昂贵的随机访问 I/O 操作,该操作可能需要立即从磁盘中读取受影响的索引页。随着页面被其他读取操作读取到缓冲池中,缓冲的更改可以稍后应用。

**A.16.3. **
更改缓冲区是否支持其他类型的索引?
否。更改缓冲区仅支持二级索引。不支持聚 Cluster 索引,全文索引和空间索引。全文索引具有自己的缓存机制。

**A.16.4. **
InnoDB为更改缓冲区使用了多少空间?
在 MySQL 5.6 中引入innodb_change_buffer_max_size配置选项之前,系统 table 空间中磁盘上更改缓冲区的最大大小是InnoDB缓冲池大小的 1/3.
在 MySQL 5.6 和更高版本中,innodb_change_buffer_max_size配置选项将更改缓冲区的最大大小定义为总缓冲池大小的百分比。默认情况下,innodb_change_buffer_max_size设置为 25.最大设置为 50.
InnoDB如果会导致磁盘上的更改缓冲区超过定义的限制,则不会缓冲操作。
更改缓冲区页面不需要保留在缓冲池中,并且可能被 LRU 操作驱逐。

**A.16.5. **
如何确定更改缓冲区的当前大小?
更改缓冲区的当前大小由INSERT BUFFER AND ADAPTIVE HASH INDEX标题下的SHOW ENGINE INNODB STATUS \G报告。例如:
----


插入缓冲区和自适应哈希索引
----

Ibuf:大小 1,空闲列 tablelen 0,seg 大小 2,0 合并
相关数据点包括:
size:更改缓冲区中使用的页数。更改缓冲区大小等于seg size - (1 + free list len)1 +值 table 示更改缓冲区头页面。
seg size:更改缓冲区的大小(以页为单位)。
有关监视更改缓冲区状态的信息,请参见第 14.5.2 节“更改缓冲区”
|
**A.16.6. ** |何时会发生更改缓冲区合并?|
||将页面读入缓冲池时,在页面可用之前,缓冲的更改将在读取完成后合并。
更改缓冲区合并作为后台任务执行。 innodb_io_capacity参数设置由InnoDB后台任务执行的 I/O 活动的上限,例如合并来自更改缓冲区的数据。
在崩溃恢复期间执行更改缓冲区合并。当将索引页读入缓冲池时,更改将从更改缓冲区(在系统 table 空间中)应用于辅助索引的叶页。
更改缓冲区是完全耐用的,并且可以在系统崩溃后幸免。重新启动后,更改缓冲区合并操作将恢复为正常操作的一部分。
可以使用--innodb-fast-shutdown=0强制将更改缓冲区完全合并为服务器缓慢关闭的一部分。
|
**A.16.7. ** |何时将更改缓冲区刷新?
||更新的页面通过与刷新占用缓冲池的其他页面相同的刷新机制进行刷新。
|
**A.16.8. ** |何时应使用更改缓冲区?|
||更改缓冲区是一项旨在减少随着索引变大而不再适合InnoDB缓冲池的二级索引的随机 I/O 的功能。通常,当整个数据集都无法容纳到缓冲池中时,当大量的 DML 活动会修改二级索引页面时,或者当许多二级索引因 DML 活动而定期更改时,应使用更改缓冲区。
|
**A.16.9. ** |何时不应该使用更改缓冲区?|
||如果整个数据集都适合InnoDB缓冲池,或者二级索引相对较少,或者您使用的是固态存储(其中随机读取的速度与 Sequences 读取的速度差不多),则可以考虑禁用更改缓冲区。在进行配置更改之前,建议您使用具有代 table 性的工作负载运行测试,以确定禁用更改缓冲区是否会带来任何好处。
|
**A.16.10. ** |在哪里可以找到有关更改缓冲区的其他信息?
||See 第 14.5.2 节“更改缓冲区”.|