1.MySQL数据库和底层的操作系统之间的交互原理

MySQL在实际工作时候的两种数据读写机制,一种是对 redo log、binlog这种日志进行的磁盘顺序读写,一种是对表空间的磁盘文件里的数据页进行的磁盘随机读写。

2.磁盘随机读写操作

磁盘随机读操作

MySQL在工作的时候,尤其是执行增删改操作的时候,肯定会先从表空间的磁盘文件里读取数据页出来,这个过程就是典型的磁盘随机读操作

MYSQL 随机排序 mysql顺序写和随机写_mysql

在上图中,有一个磁盘文件,里面有很多的数据页,因为要读取的这个数据页可能在磁盘的任意一个位置,所以在读取磁盘里的数据页的时候只能用随机读的方式。这就是磁盘随机读

磁盘随机读的性能问题

磁盘随机读的性能是比较差的,所以不可能每次更新数据都进行磁盘随机读,必须是读取一个数据页之后放到Buffer Pool的缓存里去,下次要更新的时候直接更新Buffer Pool里的缓存页。

频繁随机读写造成的性能问题 -- IOPS、响应延迟

所谓IOPS,就是底层的存储系统每秒可以执行多少次的磁盘读写操作,比如底层磁盘支持每秒执行1000个磁盘随机读写操作和每秒200个磁盘随机读写操作,对数据库的性能影响是非常大的。

IOPS指标对数据库的CRUD操作的QPS影响是非常大的,它几乎决定了数据库每秒能执行多少SQL语句,底层存储的IOPS越高,数据库的并发能力就越高。

磁盘随机读写的响应延迟,也会对数据库的性能造成很大的影响。假设底层磁盘支持每秒执行200个随机读写操作,那么每个操作是耗费10ms完成,还是耗费1ms完成,这 在一定程度上决定了数据库执行的单个CRUD SQL语句的性能。

一般对于核心业务的数据库的生产环境机器规划,都是推荐使用SSD固态硬盘的,而不是机械硬盘,因为SSD固态硬盘的随机读写并发能力和响应延迟要比机械硬盘好的多,可以大幅度提升数据库的QPS和性能。

3.磁盘顺序读写

磁盘顺序读写,在Buffer Pool的缓存页里更新了数据之后,必须要写一条redo log日志,这条 redo log 日志,就是走的顺序写。

所谓顺序写,就是说在一个磁盘日志文件里,一直在末尾追加日志。

MYSQL 随机排序 mysql顺序写和随机写_MYSQL 随机排序_02

如上图所示,写redo log日志的时候,其实是不断的在一个日志文件末尾追加日志的,这就是磁盘顺序写

磁盘顺序写的性能几乎跟内存随机读写的性能差不多,并且在数据库里用了os cache机制,redo log顺序写入磁盘之前,先是进入 os cache,也就是操作系统的内存缓存里。

对写磁盘日志文件来说,磁盘每秒读写多少数据量的吞吐量指标,也就是说每秒可以写入磁盘100MB数据和写入磁盘200MB数据,对数据库的并发能力影响很大。

4.总结

数据库的每一次更新SQL语句,会涉及到多个磁盘随机读取数据页的操作,也会涉及到一条 redo log日志文件顺序写的操作。所以磁盘读写的IOPS指标,就是每秒可以执行多少个随机读写操作,以及每秒可以读写磁盘的数据量的吞吐量指标,就是每秒可以写入多少 redo log 日志,整体决定了数据库的并发能力和性能。