两次写:
场景:
当发生数据库宕机时,可能innodb存储引擎正在写入某个页到表中,而这个页只写了一部分,这种情况被称为部分写失效,如果发生,可以通过重做日志进行恢复,重做日志中记录的是对页的物理操作:例如偏移量 800,写‘aaaa’记录。如果这个页本身已经发生了损坏,再对其进行重做是没有意义的,这就是说,在应用(apply)重做日志前,用户需要一个页的副本,当写入失效发生时,先通过页的副本来还原该页,再进行重做,这就是两次写(doublewrite)
组成:
doublewrite由两部分组成,一部分是内存中的doublewrite buffer,大小为2mb,另一部分是物理磁盘上共享表空间中连续的128个页,即两个区,大小同样为2mb。在对缓冲池的脏页进行刷新时,并不直接写磁盘,而是会通过memcpy函数将脏页限制到内存中的doublewrite buffer,之后通过doublewrite buffer再分两次,每次1mb顺序地写入共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘,避免缓冲写带来的问题。在这个过程中,因为doublewrite页是连续的,因此这个过程是顺序写的,开销并不是很大。在完成doublewrite页的写入后,再将doublewrite buffer中的页写入各个表空间文件中,此时的写入是离散的。
如果操作系统在将页写入磁盘的过程中发生了崩溃,在恢复过程中,innodb存储引擎可以从共享表空间中的doublewrite中找到该页的一个副本,将其复制在表空间文件,再应用重做日志。
自适应哈希索引:
innodb存储引擎会监控对表上各索引页的查询,如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引。(AHI)
AHI是通过缓冲池的b+树页构造而来,因此建立的速度很快,而且不需要对整张表构建哈希索引。innodb存储引擎后自动根据访问的频率和模式来自动地为某些热点页建立哈希索引
innodb_adaptive_hash_index
异步io:innodb_use_native_aio
刷新邻接页:innodb_flush_neighbors