关于MySQL中的change_buffer
MySQL中通过MVCC+锁解决了读的并发场景,而写的并发就由change_buffer来解决,其实也就是我们常说的写缓冲
原理:
DML操作⼆级索引,判断数据⻚是否在buffer pool中,不在则到change_buffer中操作,然后以⼀定频率对数据和辅助索引数据⻚进⾏merge。
主要作用:
多次操作合并为一次,减少IO,提升DML性能
特性:
- 特殊的缓存结构,⽤于缓存不在buffer pool⾥⾯的⼆级索引
- ⽀持inser,update,delete(DML)
- ⼆级索引被读取到buffer pool时候:执⾏select语句检查是否在change_buffer,在则merge到索引⻚
- 后台主线程定期merge并刷盘
总结
简单来说,大家可以想象一下如果没有change_buffer会怎么样
所有的DML(除insert)都会先从磁盘读取数据页加载到内存,修改后又刷盘
但是有change_buffer,只需要修改或插入数据,之后统一合并落盘即可,大大减少IO。
例如一些写或更新多,查询少的场景下,我们可以增加innodb_change_buffer_max_size的大小以提升性能。
彩蛋
为什么change_buffer对主键索引或唯一索引无效
因为主键索引或唯一索引,需要判断数据是否唯一,需要先加载数据页判断。那么既然已经加载了就直接在buffer pool修改数据页刷回去就行了。