
- 启动insert buffer 索引后,辅助索引页中的记录可能被插入到 insert buffer b+树中,为了保证 每次 merge 成功,需要一个数据结构标记 每个辅助索引页的可用空间=== Insert Buffer BitMap。
- 合并时机:辅助索引页被读取到缓冲池: 当执行查询操作时, 在 insert buffer bitmip中看一下 对应的辅助索引页是否有插入记录,如果有 就进行合并。 那么 某个多次插入 就可以合并到一个次执行。

- bitmap发现对应的辅助索引页 无可用空间。
Master Thread执行: 不同于 查询时的合并, 该线程执行时 会合并多个页, 选取合并页 的算法是 随机选取 insert Buffer B+ 树,确保公平性。
什么条件下可以使用chang buffer
对于唯一索引,每次插入时会判断该条数据是否已经存在于数据中,但是判断存在之前 如果需要插入的那页没有在内存中,会多一次IO来读取页 再判断是否数据已存在。因此 唯一索引不能使用insert buff。
- 对于普通索引来说 就不需要判断页中是否存在该数据,直接插入即可。
如果场景是 更新之后马上读的话,那也没必要使用 change buffer, 因为更新之后读的话,会从磁盘读入最新数据,然后合并changebuffer,就会触发merge过程, 因此 随机IO访问不会减少而且还增加了维护缓冲的代价。
redolog 与change buffer 的比较
redlog是做持久化的,减少了写入到磁盘的随机IO。而 chang buffer 是减少了 从磁盘随机读的IO,因为在更新时,不必去读取磁盘数据,直接在changbuffer 中进行插入。
总结
change buffer 使用与普通索引的写操作, 如果对应的数据页不在内存中,就去直接写 change buffer,可能在一段时间内插入了多个数据,在这之后 读取数据时, 就会通过一次的IO 来进行合并 然后返回数据,就将多个写操作 合并到了一个IO里面解决 极大的提高的性能。 因此changebuffer 是对 读磁盘的一个优化 减少了随机IO。
