Change Buffer - 图1

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

Change Buffer - 图2

  • 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。