17.11.1 InnoDB 磁盘I/O
InnoDB
使用可能的地方异步磁盘I/O,通过创建多个线程来处理I/O操作,同时允许其他数据库操作继续进行,而I/O仍在进行中。Linux和Windows平台上,InnoDB
使用可用的OS和库函数来执行“native”异步I/O。其他平台上,InnoDB
仍然使用I/O线程,但是线程可能实际等待I/O请求完成;这种技术称为“simulated”异步I/O。
如果InnoDB
可以确定数据可能很快需要,会执行读取前置操作,以将该数据加载到缓冲池中,使其在内存中可用。对连续数据的几个大型读取请求可以比对散布的多个小型读取请求更为高效。InnoDB
中有两个读取前置算法:
-
在顺序读取前置中,如果
InnoDB
发现对表空间的一部分的访问模式是顺序的,它将提前批量地向I/O系统提交数据库页面的读取请求。 -
在随机读取前置中,如果
InnoDB
发现某个表空间的一部分似乎正在被完全加载到缓冲池中,它将提交剩余的读取请求到I/O系统。
关于配置读取预先 heuristics 的信息,请见第17.8.3.4节,“Configuring InnoDB Buffer Pool Prefetching (Read-Ahead)”。
双写缓冲区
InnoDB
使用了一种 novel 文件刷新技术,涉及到一个称为双写缓冲区的结构,这在大多数情况下默认启用(innodb_doublewrite=ON
)。它添加了安全性,以便在意外退出或断电时恢复,并且在大多数 Unix 版本上提高性能,减少需要fsync()
操作的需求。
在将页面写入数据文件之前,InnoDB
首先将它们写入一个称为双写缓冲区的存储区域。只有在写入和刷新到双写缓冲区完成后,InnoDB
才将页面写入其正确位置中的数据文件。如果在中断写入过程(导致撕裂页情况)时出现操作系统、存储子系统或mysqld
进程退出,InnoDB
可以在恢复过程中找到双写缓冲区中的一个良好副本。
关于双写缓冲区的更多信息,请见第17.6.4节,“Doublewrite Buffer”。