![](https://img.haomeiwen.com/i17044733/0d13e9df917c00dd.png)
InnoDB的特性包括
插入缓冲主要针对的是非聚类索引的插入,不是每次直接插入到索引页中,而是先判断插入的非聚类索引页是否在缓冲池中,若在则直接插入,若不在,则先放到一个叫Insert Buffer对象中,然后在以一定的频率和情况进行Insert Buffer和辅助索引叶子节点的merge操作,这时通过将多个插入操作合并到一个操作中(因为在一个索引页中),这个大大提高了非聚类索引的插入性能。而对于更新操作,可以分为两个过程,将记录标记为已删除和真正将记录删除,Delete Buffer和PurgeBuffer分别对应更新的两个阶段。
Insert Buffer和Change Buffer的使用必须满足两个条件:
1)索引是辅助索引(secondary index)
2)索引不是唯一的
可以通过
SHOW ENGINE INNODB STATUS\G;
查看Insert Buffer的使用情况,如下图所示
seg size表示当前Insert Buffer的大小, merges表示合并的次数,即真正插入的次数
insert 表示Insert Buffer, delete mark 表示Delete Buffer, delete 表示 Purge Buffer
可以通过innodb_change_buffer_max_size来控制Change Buffer的大小
表示Change Buffer最大占用Buffer Pool的25%,该值的最大有效值为50
两次写保证数据页的可靠性,如果Innodb存储引擎在写入某个页到表中,而这个页只写入一部分,如16k的页仅仅写了前4k时发生数据库宕机,这种情况就是数据写失效,此时可以通过重做日志进行恢复,但是重做日志中记录的是对页的物理操作,如果页本身已经损坏,在对其进行重做是没有意义的,也就是说在重做之前,用户需要一个页的副本,当写入失效时,先通过副本来还原该页,在进行重做,这就是double write,可以通过参数skip_innodb_doublewrite可以禁止使用doublewrite功能。
一共写了1104533页,实际写入次数为197839,两者的比值远大于64,说明系统写操作压力比较大
比较pages_written 和 pages_flushed两个值基本相等,说明每次刷新缓存的时候,都会写入doublewrite buffer
InnoDB存储引擎会监控对表上个索引页的查询。如果观察到建立哈希索引能够带来速度的提升,则建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index, AHI),AHI是通过缓冲池的B+树页构造出来的,因此建立的速度很快,而且不需要对整张表构建hash索引。InnoDB存储引擎会自动根据访问频率和模式来自动的为某些热点数据建立哈希索引。
用户可以在发出一个IO请求之后,立即在发出下一个IO请求,当全部IO请求发送完毕之后,等待所有的IO操作的完成,这就是AIO。AIO的优势是可以进行IO Merge操作,即将多个IO合并为一个IO操作,提升性能。通过查询innodb_use_native_aio来查询是否开启AIO,官方测试开启AIO后,恢复速度可以提升75%。
当刷新一个脏页时,InnoDB存储引擎会检测该页所在的区(extent)的所有页,如果是脏页,那么一起进行刷新,优点显而易见就是减少IO次数,在传统的机械硬盘上有着很大的性能提升,但是需要考虑两个问题:
1)是不是会将不怎么脏的页进行写入,而该页很快又会变成脏页?
2)固态硬盘有着很高的IOPS,是否需要这个特性?
可以通过innodb_flush_neighbors来控制是否开启该功能。
建议:对于固态硬盘,该参数设置为0.
网友评论