插入缓冲Insertbuffer是mysqlinnodb存储引擎中一个比较令人兴奋的功能,乍一看名字buffer?难道是mysql缓冲池的一个组成部分?其实insertbuffer和数据页一样也是物理页的一个组成部分。
主键
我们现在设计一个数据表的时候,一般都有主键而且主键是自增长的,这时插入的索引都是连续的,也就是我们说的聚集索引,聚集索引的好处就是一般数据都是顺序存储的,如果你的sql读的是某一块连续的数据块,这样因为聚集索引的连续性,你不需要访问多个不同的数据页来访问数据,大大减少了IO,提升了查询速度。一般情况下,主键索引的插入也非常快,因为不需要离散的读取数据页,除非你自己设置了主键的值,比如说你第一次插入的主键是1,后面的sql,自己设置主键非要设置个,那么极有可能和第一次插入的主键索引不在一个数据页上,这时需要额外的一次IO。OK,没问题,以后我不自己设置主键的值,那么非聚集索引呢?就是普通的索引,连续性不能保证了怎么办?那么就到了今天要讲的insertbuffer了。
Insertbuffer
对于非聚集索引来说,比如存在用户购买金额这样一个字段,索引是普通索引,每个用户的购买的金额不相同的概率比较大,这样导致可能出现购买记录在数据在数据里的排序可能是,3,,35...,这种不连续的数据,mysql如果说,忽略这种情况,来一个我直接写入磁盘,那么mysql估计很累,一会插入这个数据页,一会插入那个数据页,我们都知道IO是很耗时的,所以出现了InsertBuffer。InsertBuffer是怎么做的呢?mysql对于非聚集索引的插入,先去判断我要插入的索引页是否已经在内存中了,如果不在,我暂时不着急先把索引页加载到内存中,而是把它放到了一个InsertBuffer对象中,临时先放在这,然后等待情况,等待很多和现在情况一样的非聚集索引,等InsertBuffer差不多了,再和要插入的非聚集索引页合并,比如说现在InsertBuffer中有1,99,2,,合并之前可能要4次插入,合并之后1,2可能是一个页的,99,可能是一个页的,这样就减少到了2次插入。效率就这样提升了
Insertbuffer的条件
索引必须是辅助索引如果是聚集索引,那就没什么要合并的必要了
不能是唯一索引因为插入缓冲的时候,mysql不会去判断数据的唯一性,如果要判断唯一性,就要离散读,失去了InsertBuffer的意义。
欢迎