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 叶节点如图:

mysql-innodb关键特性_第1张图片
说明:前三个字段和非叶节点中的含义相同,metadata(占用4字节)存储内容如图:
mysql-innodb关键特性_第2张图片

IBUF_REC_OFFSET_COUNT(2字节的整数):用来排序每个记录进入insert buffer的顺序


insert buffer bitmap:标记每个辅助索引页的可用空间,保证每次merge insert buffer页必须成功(启用insert buffer索引后,辅助索引页中的记录可能被插入到insert bufferB+树中)

每个辅助索引页在insert buffer bitmap页中占用4位,由三个部分组成:

mysql-innodb关键特性_第3张图片

4.merge insert buffer

merge insert buffer的操作可能发生的情况:

辅助索引页被读取到缓冲池中(检查insert buffer bitmap页,确认该辅助索引页是否有记录存放与insert buffer B+树种,若有,则将insert buffer B+树中该页的记录插入到该辅助索引页中。对该页多次的记录操作通过一次合并到原有的辅助索引页,因此提高了性能)

insert buffer bitmap页追踪到该辅助索引页已无可用空间时(当插入辅助索引记录时检测到插入记录后可用空间小于1/32页,则会强制执行一个合并操作,即强制读取辅助索引页)

master thread(每秒或每10秒进行一次合并操作(但合并的数量不一样,由innodb_io_capacity的百分比决定),)


二、两次写

insert buffer 给innodb带来了性能上的提升,doublewrite给innodb存储引擎带来了数据页的可靠。

部分失效:当发生数据库宕机时,innodb存储引擎正在写某个页的一部分,如一个页只写了前4kb,之后就发生了宕机

doublewrite的组成:

内存中的doublewrite buffer,大小为2MB

物理磁盘上共享空间中连续的128个页,即2个区,大小为2MB

mysql-innodb关键特性_第4张图片
说明:通过show global status like 'innodb_dblwr%'查看doublewrite的运行情况
mysql-innodb关键特性_第5张图片

说明:用户若需要统计数据库在生产环境中写入的量,可以通过innodb_dblwr_pages_written进行统计。

参数skip_innodb_doublewrite可以禁止使用doublewrite功能

三、自适应哈希索引

哈希一般情况下一把仅需一次查找就能定位数据,而B+树的查找次数取决于B+树的高度

自适应哈希索引(AHI):innodb存储引擎会监控对表上各索引页的查询,如果建立哈希索引可以提升速度,则建立哈希索引(通过缓冲池的B+树页构造而来,建造速度快且不需要对整张表构造哈希索引。根据访问的频率和模式自动为某些热点页建立哈希索引)

注:AHI对页的连续访问模式必须是一样的,只能搜索等值的查询

通过show engine innodb status可以查看AHI的使用状况

mysql-innodb关键特性_第6张图片

说明:通过hash searches/s:non-hash searches/s可以大概了解使用哈希索引的效率

通过innodb_adaptive_hash_index参数可以禁用此特性,默认是开启


四、异步IO

数据库系统采用异步IO(Async IO)的方式来处理磁盘操作来提高磁盘性能

AIO:用户可以发出一个IO请求后立即再发出另一个IO请求,当全部IO请求发送完毕后,等所有IO操作完成(优势:可以进行IO merge操作,即将多个IO合并为1个IO,提高了IOPS性能)

native AIO:内核级别的AIO支持

通过innodb_use_native_aio参数可以查看是否启动native AIO,默认为on

mysql-innodb关键特性_第7张图片

说明:脏页的刷新(即磁盘的写入操作),read ahead都是通过AIO完成的


五、刷新邻进页(flush neighbor page)

工作原理:当刷新一个脏页时,innodb会检测该页所在区的所有页,如果是脏页,则一起刷新

通过innodb_flush_neighbors参数可以控制是否启动该特性,建议传统机械硬盘建议启用该特性,对于固态硬盘将该参数设置为0,即关闭此特性



译者介绍:家华,从事mysqlDBA的工作,记录自己对mysql的一些总结




你可能感兴趣的:(mysql-innodb关键特性)