A.16.1。 | 哪些类型的操作会修改二级索引并导致更改缓冲? |
| INSERT ,,UPDATE 和DELETE 操作可以修改二级索引。如果受影响的索引页不在缓冲池中,则可以将更改缓冲在更改缓冲区中。
|
A.16.2。 | InnoDB 更改缓冲区有什么好处?
|
| 当二级索引页不在缓冲池中时,对二级索引更改进行缓冲可以避免昂贵的随机访问I / O操作,该操作可能需要立即从磁盘中读取受影响的索引页。当页面被其他读取操作读取到缓冲池中时,缓冲的更改可以稍后分批应用。 |
A.16.3。 | 更改缓冲区是否支持其他类型的索引? |
| 否。更改缓冲区仅支持二级索引。不支持聚簇索引,全文索引和空间索引。全文索引具有其自己的缓存机制。 |
A.16.4。 | InnoDB 更改缓冲区使用多少空间?
|
| innodb_change_buffer_max_size 在MySQL 5.6中引入配置选项之前,系统表空间中磁盘更改缓冲区的最大大小为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
相关数据点包括: size :更改缓冲区内使用的页面数。更改缓冲区的大小等于seg size -(1 + free list len) 。该1 + 值表示更改缓冲区标题页。seg size :更改缓冲区的大小(以页为单位)。
有关监视更改缓冲区状态的信息,请参见“InnoDB更改缓冲区”。 |
A.16.6。 | 何时发生更改缓冲区合并? |
| - 将页面读入缓冲池时,在页面可用之前,缓冲的更改会在读取完成后合并。
- 更改缓冲区合并作为后台任务执行。该
innodb_io_capacity 参数设置由InnoDB 后台任务(例如合并来自更改缓冲区的数据)执行的I / O活动的上限。 - 在崩溃恢复期间执行更改缓冲区合并。当将索引页读入缓冲池时,更改将从更改缓冲区(在系统表空间中)应用于辅助索引的叶页。
- 更改缓冲区是完全耐用的,并且可以在系统崩溃后幸免。重新启动后,更改缓冲区合并操作将作为正常操作的一部分恢复。
- 可以使用强制将更改缓冲区完全合并为缓慢的服务器关闭的一部分
--innodb-fast-shutdown=0 。
|
A.16.7。 | 更改缓冲区何时刷新? |
| 更新的页面将通过与刷新占用缓冲池的其他页面相同的刷新机制进行刷新。 |
A.16.8。 | 什么时候应该使用更改缓冲区? |
| 更改缓冲区是一项旨在减少随索引变大而不再适合InnoDB 缓冲池的二级索引的随机I / O的功能。通常,当整个数据集都无法容纳到缓冲池中时,当大量的DML活动会修改二级索引页面时,或者当许多二级索引被DML活动定期更改时,应使用更改缓冲区。 |
A.16.9。 | 什么时候不应该使用更改缓冲区? |
| 如果整个数据集都适合InnoDB 缓冲池,或者二级索引相对较少,或者您使用的是固态存储(其中随机读取的速度与顺序读取的速度差不多),则可以考虑禁用更改缓冲区。在进行配置更改之前,建议您使用代表性的工作负载运行测试,以确定禁用更改缓冲区是否有任何好处。 |
A.16.10。 | 在哪里可以找到有关更改缓冲区的其他信息? |
| 请参见“InnoDB更改缓冲区”。 |