MySQL--Insert Buffer


在进行数据插入时,须要将数据插入到汇集索引和非汇集索引中,而对于非汇集索引,须要先肯定数据要插入的索引页,再将索引页加载到内存中进行修改,而在业务上很难保证插入数据在非汇集索引上也是连续的,所以插入操做会引入大量随机IO操做。缓存

Innodb存储引擎引入Insert Buffer Pool特性来对插入操做进行优化,在INSERT操做是,对非惟一索引的更新没有实时更新,而是将更新操做进行缓存,在必定条件下再触发操做将更新操做应用到索引上。
操做原理:
插入数据时判断索引页是否存于内存中:
一、索引页存在于内存中,直接更新索引页
二、索引页不存在于内存中,且知足将更新操做放入Insert Buffer Pool操做条件,将更新操做信息和索引页信息放入到Insert Buffer Pool中。异步

虽然"更新操做"能够被暂时缓存到Insert Buffer Pool中,但最终仍是须要将"更新操做"应用到索引页上,即Merge操做,Merge操做根据触发方式分为两种:
一、主动Merge,由Innodb主线程按期后台进行,采用异步IO进行操做读取索引页面,而后进行merge。
A) 对于每秒执行一次主线程,若是过去1s以内发生的I/O小于系统I/O能力的5%,则触发一次Merge操做,merge的页面数为系统I/O能力的5%
B) 对于每10秒执行一次得主线程,一定触发一次merge操做,merge的页面数为系统I/O能力的5%性能

二、被动Merge,由用户操做触发:
A) Insert操做致使目标索引页的空间不足,须要进行页拆分操做,Insert Buffer只能处理单个页面,不能缓存须要拆分的索引页。
B) 当前Insert Buffer太大,须要强制进行merge操做。
C) 因为特殊缘由,将"更新操做"放入Insert Buffer时出错,须要将"更新操做"直接应用到索引页上。
D) 用户操做需访问索引页,将索引页从磁盘中加载到内存,将Inser Buffer中缓存的"更新操做"进行merge。优化


##====================================================##
Insert Buffer优势:
一、在INSERT操做能快速返回,提升插入效率
二、在进行Merge时,能够将多个连续的页面一次读取到内存中进行merge,减小随机IO带来的性能损耗,将随机IO转换为顺序IO线程

##====================================================##
Insert Buffer的相关知识点
一、Innodb存储引擎使用Insert Buffer Bitmap来跟踪每一个非汇集索引页的使用状况,从而推断出是否会发生页拆分的状况。
二、非汇集惟一索引没法使用Insert Buffer,由于须要在插入时须要读取索引页来肯定插入数据是否惟一。
三、在MySQL 5.5中,对Insert Buffer进行加强,引入Change Buffer特性,能对INSERT/DELETE/UPDATE操做的修改信息进行缓存。
##====================================================##3d

相关文章
相关标签/搜索