Documentation Home

14.12.1 InnoDB 磁盘 I/O

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使用一种新颖的文件刷新技术,该技术涉及称为 双写缓冲区的结构,在大多数情况下默认启用 ( innodb_doublewrite=ON)。它增加了意外退出或断电后恢复的安全性,并通过减少fsync()操作需求提高了大多数 Unix 的性能。

在将页面写入数据文件之前,InnoDB 首先将它们写入称为双写缓冲区的连续表空间区域。只有在对双写缓冲区的写入和刷新完成后,才会InnoDB 将页面写入数据文件中的正确位置。如果在页面写入过程中出现操作系统、存储子系统或意外 的mysqld进程退出(导致页面撕裂 情况),InnoDB稍后可以在恢复期间从双写缓冲区中找到该页面的良好副本。

如果系统表空间文件(ibdata 文件)位于支持原子写入的 Fusion-io 设备上,双写缓冲将自动禁用,并且 Fusion-io 原子写入用于所有数据文件。由于双写缓冲区设置是全局的,因此对于驻留在非 Fusion-io 硬件上的数据文件,双写缓冲区也被禁用。此功能仅在 Fusion-io 硬件上受支持,并且仅在 Linux 上为 Fusion-io NVMFS 启用。要充分利用此功能, 建议innodb_flush_method设置 O_DIRECT为 。