作用:解决非聚集索引插入数据性能底下问题,提高非聚集索引的查询效率
-
自增的id列的(插入时主键设置为null)插入会非常快,因为一般情况下不用随机读取另一个页中的记录。(类似的插入也是同理)
-
一张表中有可能有多个非聚集的辅助索引,当数据插入时辅助索引顺序和主键不一致时,对应非聚集索引叶子节点的插入就不是顺序的了,此时插入性能就会下降。插入缓冲就是用来缓解辅助索引数据插入慢的问题。(多次插入变一次插入)
原理
-
对于非聚集索引插入或更新操作不是每次都直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在直接插入缓冲池,不在就放一个到Insert Buffer中,然后再以一定规则合并到辅助索引叶子节点中,此时通常能将多个插入合并到一个操作中,从而提高插入性能。
使用规则
-
索引是辅助索引
-
索引不是唯一(如果是唯一也需要遍历,没有意义)
Change Buffer
-
Change Buffer用于存储SQL变更操作,比如Insert/Update/Delete等SQL语句;
-
Change Buffer中的每个变更操作都有其对应的数据页,并且该数据页未加载到缓存中;
-
当Change Buffer中变更操作对应的数据页加载到缓存中后,InnoDB会把变更操作Merge到数据页上;
-
InnoDB会定期加载Change Buffer中操作对应的数据页到缓存中,并Merge变更操作;
-
innodb_change_buffer_max_size
: 配置写缓冲的大小,占整个缓冲池的比例,默认值是25(标识25%),最大值是50。 写多读少的业务,才需要调大这个值。 -
innodb_change_buffering
: 配置哪些写操作启用写缓冲,可以设置成all/none/inserts/deletes/purges--默认all所有。
写入索引叶子节点规则
-
访问变更操作对应的数据页;
-
InnoDB后台定期Merge;
-
数据库Buffer Pool空间不足;
-
数据库正常关闭时;
-
Redo Log写满时。