ITPub博客

mysql-innodb关键特性

原创 MySQL 作者:liangjiahual 时间:2018-03-09 12:48:15 0 删除 编辑

一、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;offset(占用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位,由三个部分组成:


二、两次写

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,即关闭此特性


mysql启动、关闭和恢复

在关闭mysql时,参数innodb_fast_shutdown影响着表的存储引擎为innodb的行为,可取值为0,1,2默认为1

0:在关闭mysql时,innodb需要完成full purge和merge insert buffer且将所有脏页刷新回磁盘

1:在关闭mysql时,不需要完成full purge和merge insert buffer,只将脏页刷新回磁盘

2:在关闭mysql时,不需要完成full purge和merge insert buffer,也不将脏页刷新回磁盘,住需要将日志写入日志文件。但在下次mysql启动时会进行恢复操作。


参数innodb_force_recovery影响着innodb恢复情况,默认为0

0:当发生恢复时,进行所有的恢复操作;当不能进行有效恢复时,把错误写进错误日志

1:忽略检查到的corrupt页

2:阻止master thread的运行,如master thread进行full purge操作会导致crash

3:不进行事务的回滚操作

4:不进行插入缓冲的合并操作

5:不查看撤销日志,innodb会将未提交的事务视为已提交

6:不进行前滚操作

注意:当innodb_force_recovery大于0后,用户可以对表进行select、create、drop操作,不允许insert、update、delete操作



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31523382/viewspace-2151661/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-03-04

  • 博文量
    4
  • 访问量
    17351