InnoDB关键特性 Insert Buffer

Insert Buffer的使用场景:非唯一辅助索引的插入操作

对于非聚集索引的插入或者更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若在,则直接插入到该索引页;若不在,则先放到Insert Buffer对象中,再以一定频率和情况进行Insert Buffer和辅助索引页子节点的merge操作,减少随机读取的次数。(当进行merge操作时,Insert Buffer对象中的记录对应的表已经被删除,就无需将记录合并到辅助索引中)

Insert Buffer使用条件:
1.必须是非唯一索引;因为插入缓冲时,数据库不去查找索引页来判断插入的记录的唯一性
2.必须是辅助索引;

可以通过SHOW ENGINE INNODB STATUS查看插入缓冲的信息:
seg size:显示当前Insert Buffer的大小
free list len:代表空闲列表的长度
size:代表已经合并记录页的数量
Inserts:代表插入的记录数
merged recs:代表合并的插入记录数量(非聚集索引插入或更新到Insert Buffer对象的数量)
merges:代表合并的次数,也就是实际读取页的次数(离散IO请求次数)

Change Buffer

InnoDB1.0.x开始引入change buffer,可以看作是Insert Buffer的升级。InnoDB存储引擎开始可以对DML操作—insert、delete、update进行缓存,分别对应:Insert Buffer、Delete Buffer、Purge Buffer
Change Buffer的操作对象依然是非唯一辅助索引
Delete Buffer对应update操作的第一个过程,将记录标记为删除;Purge Buffer对应update操作的第二个过程,将记录真正删除

Insert Buffer内部实现
数据结构是一棵B+Tree,MySQL4.1前的版本中每张表对应有一棵Insert Buffer B+Tree;现在的版本是全局只有一棵Insert Buffer B+Tree,负责对所有的表的辅助索引进行Insert Buffer。存放在共享表空间中,默认也就是ibdata1中。
因此试图通过独立表空间的ibd文件恢复表中数据时,往往会导致check table失败,因为表的辅助索引中的数据可能还在insert buffer中,所以通过ibd文件恢复后,还需要repair table操作重建表上的所有的辅助索引。


Insert Buffer B+Tree的非叶子节点存放查询的search key: space+marker+offset
space:待插入记录所在表的表空间id,innodb存储引擎中每个表有一个唯一的space id(4字节)
marker:兼容老版本的insert buffer(1字节)
offset:表示页所在的偏移量(4字节)
当辅助索引插入的页不在缓冲池中,存储引擎会先根据规则构造一个search key,然后查询insert buffer B+Tree,将该辅助索引记录插入到合适的叶子节点中。
叶子节点:space+marker+offset(page_no)+ metadata(4字节)+ secondary index record(s)
Insert Buffer Bitmap页用于标记每个辅助索引页的可用空间


合并插入缓冲
可能在以下几种情况中发生:
辅助索引页被读取到缓冲池
Insert Buffer Bitmap页追踪到该辅助索引页已无可用空间
master thread
第一种情况:当select操作将辅助索引页读取到缓冲池时,需要检查Insert Buffer Bitmap页,确认该辅助索引页是否有记录存放在insert buffer B+Tree。若有,将该记录插入到辅助索引页中
第二种情况:Insert Buffer Bitmap页追踪每个辅助索引页的可用空间。若合并操作插入辅助索引记录时检测到插入记录后可用空间会小于1/32页,则强制进行合并操作,即强制读取辅助索引页,将B+Tree中的该页的记录及待插入的记录插入到辅助索引页中(合并插入操作是将对辅助索引页进行插入更新操作的辅助索引记录存储起来,然后读取该辅助索引页到内存中,再往页中插入记录)
第三种情况:master thread每秒或者每10秒进行一次merge insert buffer操作。和上述两种情况不同,master thread每次进行merge操作的页的数量不同,merge操作不止是一个页,而是根据srv_innodb_io_capacity的百分比来决定真正要合并多少个辅助索引页。存储引擎随机选取B+Tree中的一页,读取该页中的所有记录的space及之后需要的数量的页。若进行merge时,要继续merge的表已经被删除,此时可以直接丢弃B+Tree中的记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值