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 节,“双写缓冲”。