### 15.11.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 系统。

    有关配置预读启发式的信息，请参阅[第 15.8.3.4 节，“配置 InnoDB 缓冲池预取（预读）”](innodb-performance-read_ahead.html).

#### 双写缓冲区

[](<>)[](<>)

`InnoDB`使用一种新颖的文件刷新技术，涉及一种称为[双写缓冲区](glossary.html#glos_doublewrite_buffer)，在大多数情况下默认启用（[`innodb_doublewrite=ON`](innodb-parameters.html#sysvar_innodb_doublewrite)）。它增加了意外退出或断电后恢复的安全性，并通过减少对大多数 Unix 的需求来提高性能`同步（）`操作。

在将页面写入数据文件之前，`InnoDB`首先将它们写入称为双写缓冲区的存储区域。只有在写入和刷新到双写缓冲区完成后`InnoDB`将页面写入数据文件中的适当位置。如果存在操作系统、存储子系统或意外[**mysqld**](mysqld.html)在页面写入过程中退出进程（导致[撕裂的页面](glossary.html#glos_torn_page)健康）状况），`InnoDB`稍后可以在恢复期间从双写缓冲区中找到该页面的良好副本。

有关双写缓冲区的更多信息，请参阅[第 15.6.4 节，“双写缓冲区”](innodb-doublewrite-buffer.html).
