InnoDB
在可能的情况下使用异步磁盘I/O,通过创建一些线程来处理I/O操作,同时允许其他数据库操作在I/O仍在进行时继续进行。在Linux和Windows平台上,InnoDB
使用可用的操作系统和库函数来执行”本地的”异步I / O。在其他平台上,InnoDB
仍然使用I/O线程,但线程实际上可能等待I/O请求完成;这种技术被称为”模拟”异步I / O。
如果InnoDB
可以确定可能很快就需要数据,它执行预读操作将该数据带入缓冲池,以便在内存中可用。对连续数据发出几个大的读请求可能比发出几个小的、分散的请求更有效率。中有两种预读法InnoDB
:
在顺序预读中,如果
InnoDB
注意,对表空间中某个段的访问模式是顺序的,它提前将一批数据库页的读取提交给I/O系统。在随机预读中,如果
InnoDB
注意到表空间中的某些区域似乎正在被完全读到缓冲池中,它将剩余的读发送到I/O系统。
有关配置预读启发式的信息,请参见第14.8.3.4节,“配置InnoDB缓冲池预取(预读)”。
InnoDB
使用一种新的文件刷新技术,涉及名为doublewrite缓冲,大多数情况下默认启用(innodb_doublewrite =对
)。它增加了意外退出或断电后恢复的安全性,并通过减少对Unix的需求提高了大多数Unix上的性能fsync ()
操作。
在向数据文件写入页面之前,InnoDB
首先,将它们写到一个称为doublewrite缓冲区的连续表空间区域。只有在doublewrite缓冲区的写入和刷新完成后才会执行InnoDB
将页写入数据文件中的适当位置。如果存在操作系统、存储子系统或意外情况mysqld进程在页写中间退出(导致撕页条件),InnoDB
稍后可以在恢复期间从doublewrite缓冲区中找到该页的良好副本。
如果系统表空间文件(”ibdata文件”)位于支持原子写的Fusion-io设备上,doublewrite缓冲自动关闭,所有数据文件使用Fusion-io原子写。因为doublewrite缓冲区设置是全局的,所以对于驻留在非fusion -io硬件上的数据文件,doublewrite缓冲区也被禁用。该特性仅支持Fusion-io硬件,仅支持Linux下的Fusion-io nvvmfs。为了充分利用这一特性,我们需要innodb_flush_method
设置O_DIRECT
建议。