文章目录
  1. 两次写
  2. 自适应哈希索引
  3. 异步IO
  4. 刷新邻接页

两次写

在数据库发生宕机时,若InnoDB存储引擎正在将某个页写入磁盘,这种情况称为部分写失效。此时页本身发生了损坏,而不是对页的修改未完全写入,故无法通过重做日志恢复。为此,引入doublewrite技术解决部分写失效的问题。

doublewrite的架构图如下。

 

doublewrite由两部分组成:(1)内存中的doublewrite buffer,大小2MB;(2)磁盘上共享表空间中连续的128个页,同样为2MB;在对缓冲池中的脏页进行刷新时,先通过memcpy函数将脏页复制到内存中的doublewrite buffer,之后分两次,从doublewrite buffer中每次1MB顺序地写入共享表空间,再立即调用fsync函数立即同步磁盘;

由于共享表空间是连续的,因此从doublewrite buffer中将页写入共享表空间的速度很快;而从共享表空间同步到磁盘则是离散写,速度较慢;此时的写可能被宕机终止,数据库系统重启后只需要从共享表空间复制副本即可!

自适应哈希索引

通过哈希查找的时间复杂度为O(1),InnoDB存储引擎会监控表上各索引页的查询,如果观察到建立哈希索引可用带来速度的提升,则建立哈希索引,即自适应哈希索引(AHI)。AHI通过缓冲池的B+树页构造而来,而不需要对整张表建立哈希索引,因此建立起来很快。

查询的条件称为访问模式;当客户端以同样的访问模式连续访问,且(1)以该模式连续访问100次;(2)页通过该模式访问了N次,N=页中记录数/16;

异步IO

当前数据库均采用异步IO来处理磁盘操作;(同步IO是指发起IO操作的进程将一直等待直到IO操作完成,才会执行后续操作,相应读写的文件描述符为阻塞的。异步IO是指发起IO操作的进程将立即返回,具体的IO操作交由内核接管,内核完成后会通知进程,相应读写的文件描述符为非阻塞的。)

刷新邻接页

当刷新一个脏页时,InnoDB存储引擎会检测该页所在区的所有页,若是脏页,则一起进行刷新,这样做可通过异步IO将多个IO操作合并为一个IO操作。