插入缓冲(insert buffer)
- 主要是插入性能提高。解决频繁数据更新带来的b+tree频繁自平衡工做。
- 对于非汇集索引的插入/更新操做先判断非汇集索引的页是否在缓冲池中,若在则直接插入。
- 若不在则先放入到一个InsertBuffer中,而后按必定频率对InsertBuffer和辅助索引页进行merge操做。
- 这是一种插入合并,减小b+tree重排。
- 索引不能是主键索引,主键索引为汇集索引,大多为自增。若是为UUID类型,则可使用InsertBuffer
- 索引非惟一,由于数据库并不会去查找索引页来判断插入的惟一性。
- 1.2之后进行了升级,Change Buffer,将DML操做细分为InsertBuffer, DeleteBuffer, PurgeBuffer
- update时,DeleteBuffer是第一个过程,标记为删除。PurgeBuffer为第二个过程,真正移除。
- InsertBuffer的内部实现是一颗B+tree,负责对全部表的的辅助索引进行InsertBuffer。
- 它存放在共享表空间中,也就是ibdata1中,因此经过ibd进行文件恢复时,须要进行RepairTable重建表上辅助索引。
二次写(double write)
- 主要是可靠性提高,解决脏页-->磁盘过程当中,未彻底写入时宕机的问题。
- 分写失效问题:16KB的页只写了4KB就发生宕机。因为重作日志是对页的物理操做,若是页已经发生损坏,对损坏页重作是没有意义的。
工做流程
1. 脏页-->磁盘过程当中,先复制到doublewriteBuffer中,而后doubleWriteBuffer分两次,每次1M写入共享表空的doublewrite上。
2. 完成共享表空间的doublewrite写操做之后,再将内存中的doubleWriteBuffer写入各个表空间中。完成双写操做。
3. 若是脏页同步过程当中发生崩溃,mysql会从共享表空间中doublewrite找到该页的一个副本,复制到各个表空间文件中再应用重作日志。

自适应哈希索引(ahi)
- Hash查找的时间复杂度为O(1),而B+tree的查找次数通常约等于3~4层。innodb会根据访问频率和模式来自动为某些热点页创建hash。
- 要求访问模式也就是查询条件固定且为=搜索,而不是范围检索。
- 当以该模式访问了100次,且页经过该模式访问了N次,其中N=页中记录数*1/16。
异步IO(Async IO)
- 能够同时发送多个IO请求,而后等待全部IO操做完成。
- IO Merge:将多个合成为一个IO,例如访问的页(space, page_no)为(8,6)(8,7)(8,8),则合成为一个IO请求从(8,6)开始。连续读48K页面。
刷新邻接页(Flush Neighbor Page)
- 磁盘预读原理。当刷新一个脏页时,InnoDB会检测该页所在区的全部页,若是是脏页则一块儿刷新。
- 经过AIO将多个IO操做合并为同一个,减小磁盘IO次数。
- 对传统硬盘有显著优点。可是在SSD中能够将此参数设置为0,即关闭。