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