一、IO分类
- Sync IO:即每进行一次IO操作,需要等待此次操作结束才能继续接下来的操作。
- AIO(Asynchronous IO) :发出一个IO请求后立即再发出另一个IO请求,当全部IO请求发送完毕后,等待所有IO操作的完成.
- Native AIO:内核级别提供的AIO支持
二、InnoDB 异步IO
1. InnoDB异步IO优势
Sync IO,即每进行一次IO操作,需要等待此次操作结束才能继续接下来的操作。但是如果用户发出的是一条索引扫描的查询,那么这条SQL查询语句可能需要扫描多个索引页,也就是需要进行多次的IO操作。在每扫描一个页并等待其完成后再进行下一次的扫描,这是没有必要的。
AIO优势:
- 用户可以在发出一个IO请求后立即再发出另一个IO请求,当全部IO请求发送完毕后,等待所有IO操作的完成,缩短了时间
- AIO的另一个优势是可以进行IO Merge操作,也就是将多个IO合并为1个IO,这样可以提高IOPS的性能。
例如用户需要访问页的(space,page_no)为:(8,6)、(8,7),(8,8)
每个页的大小为16KB,那么同步IO需要进行3次IO操作。而AIO会判断到这三个页是连续的(显然可以通过(space,page_no)得知)。因此AIO底层会发送一个IO请求,从(8,6)开始,读取48KB的页。
2. Native AIO
需要注意的是,Native AIO需要操作系统提供支持。Windows系统和Linux系统都提供Native AIO支持,而Mac OSX系统则未提供。因此在这些系统下,依旧只能使用原模拟的方式。在选择MySQL数据库服务器的操作系统时,需要考虑这方面的因素。
参数innodb_use_native_aio用来控制是否启用Native AIO,在Linux操作系统下,默认值为ON:
mysql> SHOW VARIABLES LIKE'innodb_use_native_aio';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_use_native_aio | ON |
+-----------------------+-------+
用户可以通过开启和关闭Native AIO功能来比较InnoDB性能的提升。官方的测试显示,启用Native AIO,恢复速度可以提高75%。
在InnoDB存储引擎中,read ahead方式的读取都是通过AIO完成,脏页的刷新,即磁盘的写入操作则全部由AIO完成。