InnoDB存储引擎——异步IO

InnoDB存储引擎利用异步IO(AIO)提高磁盘操作性能,减少等待时间。AIO允许并发发送多个IO请求,并通过IO Merge技术合并连续的IO操作,提升IOPS。在InnoDB1.1.x及以上版本,引入了内核级别的Native AIO,提供更好的性能。Native AIO在Linux系统默认启用,但Mac OSX不支持。开启Native AIO能显著提升恢复速度,例如官方测试显示恢复速度可提升75%。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了提高磁盘操作性能,当前的数据库系统都采用异步IO(Asynchronous IO,AIO)的方式来处理磁盘操作。InnoDB存储引擎就是这样。

AIO的概念

与AIO对应的Sync IO,即每进行一次IO操作,需要等待此操作结束才能继续接下来的操作。但是如果用户发出的是一条索引扫描的查询,那么这条SQL查询语句可能需要扫描多个索引页,也就是需要进行多次的IO操作。在每扫描一个页并等待其完成后再进行下一次的扫描,这是没有必要的。用户可以在发出一个IO请求后立即再发出另一个IO请求,当全部IO请求发送完毕后,等待所有IO操作的完成,这就是AIO。

IO Merge

AIO另一个优势是进行IO Merge操作,也就是将多个IO合并为1个IO,这样可以提高IOPS的性能。例如用户需要访问页的(space, offset)为:
(8,6),(8,7),(8,8)
每个页的大小为16KB,那么同步IO需要进行3次IO操作。而AIO会判断到这三个页是连续的(可以通过(space,offset)知道)。因此AIO底层会发送一个IO请求,从(8,6)开始,读取48KB的页。

root@TryHard:~# iostat
Linux 3.13.0-65-generic (TryHard)       03/14/2017      _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.11    0.00    0.23    0.02    0.10   99.54

Device:         tps    kB_read/s     kB_wrtn/s  kB_read    kB_wrtn
xvda            0.31      0.17       2.65       1464569     22747260

在InnoDB1.1.x之前,AIO的实现是通过InnoDB存储引擎中的代码来模拟实现。从InnoDB1.1.x开始,提供了内核级别AIO的支持,称为Native AIO。因此在编译或者运行该版本的MySql时,需要libaio库的支持。

Native AIO需要操作系统提供支持,Windows和Linux系统都提供Native AIO支持,而Mac OSX系统则未提供。

参数innodb_use_native_aio用来控制是否启动Native AIO,在Linux系统下,默认值为ON。

mysql> show variables like 'innodb_use_native_aio';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_use_native_aio | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)

用户可以通过开启和关闭Native AIO功能来比较InnoDB性能的提升。官方的测试显示,启动Native AIO,恢复速度可以提高75%。
在InnoDB存储引擎中,read ahead方式的读取都是通过AIO完成,脏页的刷新,即磁盘的写入操作则全部由AIO完成。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值