mysql写入缓存_面试官:你能和我讲下mysql的插入缓冲吗

插入缓冲Insert buffer是mysql innodb存储引擎中一个比较令人兴奋的功能,乍一看名字 buffer?难道是mysql缓冲池的一个组成部分?其实insert buffer和数据页一样也是物理页的一个组成部分。

2cf1a3563dac8cb2f6cedad6640a4bb9.png

主键

我们现在设计一个数据表的时候,一般都有主键而且主键是自增长的,这时插入的索引都是连续的,也就是我们说的聚集索引,聚集索引的好处就是一般数据都是顺序存储的,如果你的sql读的是某一块连续的数据块,这样因为聚集索引的连续性,你不需要访问多个不同的数据页来访问数据,大大减少了IO,提升了查询速度。一般情况下,主键索引的插入也非常快,因为不需要离散的读取数据页,除非你自己设置了主键的值,比如说你第一次插入的主键是1,后面的sql,自己设置主键非要设置个1000,那么极有可能和第一次插入的主键索引不在一个数据页上,这时需要额外的一次IO。OK,没问题,以后我不自己设置主键的值,那么非聚集索引呢?就是普通的索引,连续性不能保证了怎么办?那么就到了今天要讲的insert buffer了。

Insert buffer

对于非聚集索引来说,比如存在用户购买金额这样一个字段,索引是普通索引,每个用户的购买的金额不相同的概率比较大,这样导致可能出现购买记录在数据在数据里的排序可能是1000,3,499,35...,这种不连续的数据,mysql如果说,忽略这种情况,来一个我直接写入磁盘,那么mysql估计很累,一会插入这个数据页,一会插入那个数据页,我们都知道IO是很耗时的,所以出现了Insert Buffer。Insert Buffer是怎么做的呢?mysql对于非聚集索引的插入,先去判断我要插入的索引页是否已经在内存中了,如果不在,我暂时不着急先把索引页加载到内存中,而是把它放到了一个Insert Buffer对象中,临时先放在这,然后等待情况,等待很多和现在情况一样的非聚集索引,等Insert Buffer差不多了,再和要插入的非聚集索引页合并,比如说现在Insert Buffer中有1,99,2,100,合并之前可能要4次插入,合并之后1,2可能是一个页的,99,100可能是一个页的,这样就减少到了2次插入。效率就这样提升了

Insert buffer的条件

索引必须是辅助索引如果是聚集索引,那就没什么要合并的必要了

不能是唯一索引因为插入缓冲的时候,mysql不会去判断数据的唯一性,如果要判断唯一性,就要离散读,失去了Insert Buffer的意义。

欢迎关注,坚持更新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值