一、什么是insert buffer
insert buffer是一种特殊的数据结构,并不是缓存的一部分,而是物理页,当mysql更新数据,受影响的索引页不在buffer pool缓冲池中时,它会缓存二级索引页的更改,后面更新(DML)操作 ,二级索引页进入buffer pool缓冲池中时,insert buffer则进行合并操作。
最开始的时候只能是insert操作,所以叫做insert buffer,Mysql5.6以后已经改叫做change buffer了
这里的二级索引指的是非唯一索引。
二、insert buffer 原理
对于非唯一索引,如果索引页没有在buffer pool中,每次操作磁盘则代价太高(因为会修改B+树),mysql把这些索引操作放入insert buffer,当这些索引页被加载到buffer pool后,主线程会合并这些更改。意思就是必须要等索引页加载到buffer pool内存中后,在进行修改,内存修改肯定比磁盘修改效率高。
流程:
① 更新二级非唯一索引A
② 假如索引A在buffer pool中,则直接修改
③ 假如索引A没有在buffer pool中,则会把更新缓冲起来,等待A索引被加载到buffer pool中后,insert buffer在内存中的A索引进行合并。从而完成了索引A的修改。
三、 insert buffer 缺点
1、可能导致数据库宕机后实例恢复时间变长。如果应用程序执行大量的插入和更新操作,且涉及非唯一的聚集索引,一旦出现宕机,这时就有大量内存中的插入缓冲区数据没有合并至索引页中,导致实例恢复时间会很长
2、在写密集的情况下,插入缓冲会占用过多的缓冲池内存(innodb_buffer_pool),默认情况下最大可以占用1/2,这在实际应用中会带来一定的问题
3、insert buffer 无法进行控制,for different workloads and hardware configuration,特别是在SSD盛行的今天
四、 查看iinsert buffer的情况
命令 show engine innodb status;
Ibuf: size 使用了多少页
free list len 空闲的多少页
seg size = size + free list len - 1
merges :合并了多少页
merged operations: 合并成功的情况
insert 0, delete mark 0, delete 0
discarded operations: 丢弃的情况
insert 0, delete mark 0, delete 0
参考: