InnoDB磁盘I/O - MySQL

InnoDB在linux、windows上使用操作系统异步I/O库,其他平台上依然使用线程模拟异步I/O。

数据预读

InnoDB使用两个预读算法提高I/O性能:线性预读和随机预读。

线性预读

根据缓存池中顺序访问过的页面,预测可能需要的页面。

如果,从某个范围顺序读取的页数大于或等于指定值(innodb_read_ahead_threshold参数决定),认为条件成立。

随机预读

根据缓存池中已有的页面,预测可能需要的页面。

如果,缓冲池中找到来自相同范围的连续页面数达到13个,认为条件成立。

线性预读参数

innodb_read_ahead_threshold

默认值为56,取值范围:0-64。

随机预读参数

innodb_random_read_ahead=ON。

使用SET GLOBAL命令进行设置。

Doublewrite Buffer

InnoDB使用一种称为doublewrite的缓冲区提升写入操作的可靠性。

InnoDB将页面写入数据文件前,会先写入doublewrite缓冲区,doublewrite缓冲区在表空间中是一个连续的区域,只有写入和刷新成功后,才会将页面写入到数据文件。

如果在页面写入过程中,操作系统、存储系统或mysqld进程崩溃,InnoDB能在崩溃恢复时从doublewrite缓冲区中找到该页面的副本 。

虽然数据有两次写入操作,由于Doublewrite Buffer在表空间中是连续的区域,因此,I/O开销并不大,只需调用一次fsync()。

doublewrite选项默认开启,

innodb_doublewrite=0

"0"表示关闭。

注:如果系统表空间文件(ibdata)存储在支持原子写入的Fusion SSD固态硬盘上,Doublewrite Buffer会被禁用。

优化原则

控制用于提高查询性能的后台I/O量。

在满足ACID的前提下,启用或禁用非必要的I/O。