InnoDB会尽可能的使用异步磁盘I/O。它创建一定数量的现成来处理磁盘I/O操作,在I/O操作未完成时允许处理其它数据库操作。在linux和windows平台上,InnoDB使用可用的OS和库函数来执行“原生”异步I/O。在其它平台上,InnoDB仍然使用I/O线程,但是这些线程可能会等待I/O请求完成。这种技术被称为“模拟”异步I/O。
预读(Read-Ahead) #
如果InnoDB确定数据很快会被读取,它就会执行预读操作,将这些数据加载到buffer pool中。对连续的区域进行大量请求会比小的,分散的请求更高效。InnoDB中共有两种预读策略:
- 顺序预读,如果InnoDB发现对表空间中某个段的访问方式是循序的,它就会提前对数据页面进行批量读取。
- 随机预读,如果InnoDB发现表空间中的某块区域看起来会被全部读取到buffer pool中,它就会提前读取剩余的页面。
想了解更多关于预读设置的信息,见15.8.3.4;
双写缓冲(Doublewrite Buffer) #
InnoDB使用一种新颖的文件刷新技术,涉及到一种被称为doublewrite buffer的数据结构,这种刷新技术是默认启用的(innodb_doublewrite=ON)。在数据库意外崩溃或断电后,这有利于恢复,而且通过降低fysnc操作的需要,提高了在大多数类unix操作系统上的性能。
在将页面写到数据文件里之前,InnoDB会先将它们写入到一块被称为doublewrite buffer的存储区域中。只有成功写入并刷新到double write中后,InnoDB才会将它们写入到数据文件中。如果在写入一个页面时有操作系统,存储子系统,或mysqld进程的意外退出(导致 页面撕裂),InnoDB之后可以在恢复时在Buffer Pool中找到这个页面的完整副本。
想了解更多关于doublewrite buffer的信息,请查阅15.6.4,“Doublewrite Buffer”。