> For the complete documentation index, see [llms.txt](https://huataihuang.gitbook.io/cloud-atlas-draft/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://huataihuang.gitbook.io/cloud-atlas-draft/database/mysql/disk_io/when_does_mysql_perform_io.md).

# 什么时候MySQL执行IO

> 机械磁盘的性能比CPU慢2000万倍，也比内存慢10万倍。（2013年原文，当前SSD和更快的内存依然比CPU缓慢）

## 缓存IO(Buffered IO)简介

在磁盘之上设计了一种增强性能的缓存：

* 当操作系统读取数据，可以从磁盘读取或者从缓存读取。
* 当写入数据，可能不是直接写入磁盘而是写入缓存，然后有有一个队列在后台执行刷新（到磁盘）。这个（缓存）队列和应用程序的消息队列有些不同：它通常在请求数量上有硬件限制，并且不是完全按照先进先出来完成请求 - 但是有一个优化顺序来确保有一个最大时间窗口来完成请求。
  * 默认的写操作不是`crash-safe`的。操作系统保障了同步文件的方法以确保所有在缓存中数据倍刷入到磁盘：[fsync](http://linux.die.net/man/2/fsync)
  * `fsync`通常开销非常大，因为它强制队列清空，并降低了请求重排和合并的数量。对于硬盘，顺序IO是非常重要的。

以下来解析一下使用InnoDB存储引擎（从MySQL 5.5开始作为默认）的MySQL服务器。

## Reading pages into memory

## 参考

* [When does MySQL perform IO?](http://www.tocker.ca/2013/05/06/when-does-mysql-perform-io.html)
