InnoDB关键特性-异步IO、刷新邻接页

一、IO分类

1)同步IO(Sync IO),即每次IO操作,需要等待此次操作结束后,才能继续接下来的操作;
2)AIO(Asynchornous IO),发出一个IO请求后立即发出另外一个IO请求,当全部的IO请求发布完成后,等待所有的IO操作完成;
3)Native AIO,内核级别提供的异步IO支持;

二、异步IO
2.1 异步IO解决了什么问题

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

2.2 IO合并(IO Merge)

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

三、Native AIO

在InnoDB1.1.x之前,AIO是通过InnoDB存储引擎的代码来模拟实现的。而从InnoDB1.1.x开始,提供了内核级别的AIO的支持,成为Native AIO。Windows和Linux默认支持Native IO。

3.1 启用Native AIO开关

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

mysql> SHOW VARIABLES LIKE'innodb_use_native_aio';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_use_native_aio | ON    |
+-----------------------+-------+
3.2 性能的提升

用户可以通过开启和关闭Native AIO功能来比较InnoDB性能的提升。官方的测试显示,启用Native AIO,恢复速度可以提高75%。

3.3 AIO使用的场景

在InnoDB存储引擎中,read ahead方式的读取都是通过AIO完成,脏页的刷新,即磁盘的写入操作则全部由AIO完成。

四、刷新邻接页
4.1 刷新邻接页的原理

当没刷新一个脏页时,InnoDB存储引擎会检测该页所在的区(extent)的所有页,是否是脏页。如果是脏页,那么一起刷新。

4.2 刷新邻接页的优势

1)AIO可以将多个IO的写入操作合并成一个IO操作。故在传统的机械磁盘下有着显著的优势

4.3 刷新邻接页的不足

1)是否可能不需要将脏页进行写入,而这个脏页写入之后,又很快变成了脏页;
2)固态硬盘有较高的IOPS,是否需要这个特性;

4.4 参数控制

控制开关:innodb_flush_neighbors

mysql> show variables like '%neigh%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| innodb_flush_neighbors | 1     |  #默认刷新邻接页功能开启
+------------------------+-------+
1 row in set (0.00 sec)

0,表示关闭刷新邻接页
1、表示打开了刷新邻接页的功能,顺带着刷新在 buffer pool 中位于磁盘上相同的 extend 区的相邻的脏页。
2 ,表示刷新在 buffer pool 中位于磁盘上相同的 extend 区的脏页。

你可能感兴趣的:(MySQL)