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 系统发布剩余的读取请求。
有关配置预读启发式方法的信息,请参见第 17.8.3.4 节,“配置 InnoDB 缓冲池预取(预读)”.
InnoDB
使用一种新颖的文件刷新技术,涉及一个称为双写缓冲区的结构,该结构在大多数情况下默认启用 (innodb_doublewrite=ON
)。它在意外退出或断电后提高了恢复的安全性,并且通过减少对 fsync()
操作的需求,在大多数 Unix 变体上提高了性能。
在将页面写入数据文件之前,InnoDB
首先将它们写入称为双写缓冲区的存储区域。只有在写入和刷新到双写缓冲区完成后,InnoDB
才会将页面写入数据文件中的适当位置。如果在页面写入过程中发生了操作系统、存储子系统或意外的mysqld 进程退出(导致撕裂页状态),InnoDB
可以在恢复期间从双写缓冲区中找到该页面的良好副本。
有关双写缓冲区的更多信息,请参见第 17.6.4 节,“双写缓冲区”.