mysql-innodb-关键特性

插入缓冲(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找到该页的一个副本,复制到各个表空间文件中再应用重作日志。

double write

自适应哈希索引(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,即关闭。
相关文章
相关标签/搜索