Insert Buffer
对于非聚集索引的插入或者更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入;若不在,则先放入到一个Insert Buffer对象中。
数据库这个非聚集索引已经插到叶子节点,而实际并没有,只是存放在另一个位置。然后再以一定频率和情况进行Insert Buffer和辅助索引页子节点的merge(合并)操作,通常可以将多个插入合并到一个操作中(以为在一个索引页中),大大提高了非聚集索引的插入性能。
条件
- 索引是辅助索引
- 索引不是唯一索引。
满足以上两个条件时,InnoDB存储引擎会使用Insert Buffer,提高插入操作的性能。
缺点
当MySql数据库发生宕机,大量的Insert Buffer没有合并到实际的非聚集索引中,此时恢复可能需要很长的时间。
Insert Buffer在写密集的情况下,插入缓冲会占用过多的缓冲池内存。
Change Buffer
从InnoDB 1.0.x版本引入Change Buffer,可以对DML操作都进行缓冲——INSERT、DELETE、UPDATE。分别是Insert Buffer,Delete Buffer,Purge Buffer。
对同一条记录进行UPDATE操作可能分为两个过程:
- 将记录标记为删除。
- 真正将记录删除。
Delete Buffer对应第一个过程,Purge Buffer对应第二个过程。
Insert Buffer内部实现
全局Insert Buffer B+树,负责对所有表的辅助索引进行Insert Buffer。这棵B+树存放在共享表空间中,默认也就是ibdata1。
Merge Insert Buffer
将Buffer合并到真正的索引页发生在以下几种情况下:
- 辅助索引页被读取到缓冲池时。
- Insert Buffer Bitmap页追踪到该辅助索引页已无可用空间时。
- Master Thread。