1

插入缓冲(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,即关闭。

nothingnodust
16 声望2 粉丝

代码界的蔡徐坤