mysql-innodb关键特性关键特性
一、insert buffer
1.插入缓冲(insert buffer):数据页一样,是物理页的一个组成部分,其数据结构是一棵B+树,存放在ibdata1(共享表空
间)中。
注:并不是所有的主键插入都是顺序的,若主键是UUID,则插入和辅助索引一样,同样是随机的
对于非聚集索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若
在,则直接插入;若不在,则先放入一个insert buffer对象中,然后再以一定频率和情况进行insert buffer和辅助索引页子节点
的merger(合并)操作。
使用insert buffer的条件:
索引是辅助索引;
索引不是唯一的。
2.change buffer
对于insert buffer的升级,可以对DML操作—insert、delete、update都进行缓冲,change buffer使用的对象是非唯一的辅助索
引,可以通过innodb_change_buffer_max_size来控制 change buffer最大使用内存的数量,默认值为25即最多使用1/4的缓冲
池内存空间,该参数最大有效值为50
3.insert buffer的内部实现
insert buffer 数据结构是一棵B+树且全局只有一棵,负责对所有的表的辅助索引进行insert buffer,存放在共享表空间中
(ibdata1中)。试图通过独立表空间ibd文件恢复表中数据中,会导致check table失败。(由于表的辅助索引中的数据可能还
在insert buffer中,所以通过ibd文件恢复后,还需要进行repair table来重建表上所有的辅助索引)
insert buffer由叶节点和非叶节点(search key 键值)组成。
非叶节点的search key如图:
说明:space (占用4字节)表示待插入记录所在表的表空间ID(每张表都有一个唯一的space id);market(占用1字节)用
来兼容老版本insert buffer;offse(占用4字节)t表示页所在的偏移量。
过程:当辅助索引要插入到页时,如果这个页不在缓冲池中,那么innodb会先构造一个search key,接下来查询insert buffer
这棵B+树,然后将这条记录插入到insert buffer B+树的叶节点中
insert buffer 叶节点如图:
说明:前三个字段和非叶节点中的含义相同,metadata(占用4字节)存储内容如图:
IBUF_REC_OFFSET_COUNT(2字节的整数):用来排序每个记录进入insert buffer的顺序
insert buffer bitmap:标记每个辅助索引页的可用空间,保证每次merge insert buffer页必须成功(启用insert buffer索引后,