2. Change Buffer
写请求的处理流程
(1)如果索引页不在buffer pool中, 则先把索引页,从磁盘加载到缓冲池,一次磁盘随机读操作;
(2)修改缓冲池中的页,一次内存操作;
(3)写入redo log,一次磁盘顺序写操作;
是否会出现一致性问题呢?
不会, 因为:
(1)读取,会命中缓冲池的页;
(2)缓冲池LRU数据淘汰,会将“脏页”刷回磁盘;
(3)数据库异常奔溃,能够从redo log中恢复数据;
利用Change Buffer进行优化
上述场景中, 被读取的数据没有命中缓冲池的时候,会先从磁盘索引页到缓冲池中, 这样至少产生一次磁盘IO,对于写多读少的业务场景,性能压力会剧增, 于是InnoDB引入了Change Buffer:
- 当对页进行了写操作,并不会立刻将磁盘页加载到缓冲池
- 先把页的写操作记录到缓冲变更池(buffer changes)
- 等未来数据被读取时,再将数据合并(merge)恢复到缓冲池中
写缓冲的目的是降低写操作的磁盘IO,提升数据库性能。
在内存中,Change Buffer占用Buffer Pool的一部分。在磁盘上,Change Buffer是系统表空间的一部分,其中的索引会在关闭数据库服务器时更改。
Change Buffer相关参数配置
- 配置Change Pool最大大小
---innodb_change_buffer_max_size: 允许将Change Buffer的最大大小配置为缓冲池总大小的百分比。默认情况下, innodb_change_buffer_max_size设置为25.最大设置为50。- 配置Change Buffer的适用范围
---innodb_change_buffering: all | none | inserts | deletes | changes | purges