编辑推荐: |
本文来自于csdn,本文主要介绍了mysql-innodb中的插入缓冲,自适应哈希索引,提高磁盘性能的异步IO方式等相关知识,希望能对您有所帮助。 |
|
一、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索引后,辅助索引页中的记录可能被插入到insert
bufferB+树中)
每个辅助索引页在insert buffer bitmap页中占用4位,由三个部分组成:
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
说明:通过show global status like 'innodb_dblwr%'查看doublewrite的运行情况
说明:用户若需要统计数据库在生产环境中写入的量,可以通过innodb_dblwr_pages_written进行统计。
参数skip_innodb_doublewrite可以禁止使用doublewrite功能
三、自适应哈希索引
哈希一般情况下一把仅需一次查找就能定位数据,而B+树的查找次数取决于B+树的高度
自适应哈希索引(AHI):innodb存储引擎会监控对表上各索引页的查询,如果建立哈希索引可以提升速度,则建立哈希索引(通过缓冲池的B+树页构造而来,建造速度快且不需要对整张表构造哈希索引。根据访问的频率和模式自动为某些热点页建立哈希索引)
注:AHI对页的连续访问模式必须是一样的,只能搜索等值的查询
通过show engine innodb status可以查看AHI的使用状况
说明:通过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
说明:脏页的刷新(即磁盘的写入操作),read ahead都是通过AIO完成的
五、刷新邻进页(flush neighbor page)
工作原理:当刷新一个脏页时,innodb会检测该页所在区的所有页,如果是脏页,则一起刷新
通过innodb_flush_neighbors参数可以控制是否启动该特性,建议传统机械硬盘建议启用该特性,对于固态硬盘将该参数设置为0,即关闭此特性
|