MySQL:数据库的日志顺序读写以及数据文件随机读写的原理

MySQL在实际工作的时候有两种数据读写机制:

  • 一种是对redo log、binlog这种日志进行的磁盘顺序读写
  • 一种是对表空间的磁盘文件的数据页进行的磁盘随机读写

磁盘随机读写

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

如下图,是一个磁盘文件的示例,里面有很多数据页,然后你可能需要在一个随机的位置读取一个数据页到缓存,这就是磁盘随机读

在这里插入图片描述

  • 因为要读取的这个数据页可能在磁盘的任意一个位置,所以你在读取磁盘的数据页的时候只能用随机读这种方式。
  • 磁盘随机读的性能是比较差的,所以不可能每次更新数据的时候都进行磁盘随机读,必须是读取一个数据页之后放到buffer pool的缓存里去,下次要更新的时候直接更新buffer pool里的缓存页。

对于磁盘随机读来说,主要关注的性能指标是IOPS和响应延迟

  • IOPS就是说底层的存储系统每秒可以执行多少次磁盘读写的操作。这个指标实际上对数据库的CRUD操作的QPS影响非常大,因为它某种程度上决定了每秒能执行多少个SQL语句,底层存储的IOPS越高,数据库的并发能力越强
  • 磁盘随机读写操作的响应延迟,也对数据库的性能有很大影响。因为假设你的底层磁盘支持你每秒执行200个随机读写操作,但是每个操作是耗费100ms完成,还是1m完成有很大影响,决定了对数据库执行单个SQL语句的性能

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

磁盘顺序读写

当在buffer pool的缓存页里更新了数据之后,必须要写一条redo log日志,这个redo log日志,其实就是走的顺序写。

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

在这里插入图片描述
从上图可以看到,写redo log日志的时候,其实是不停地在一个日志文件末尾追加日志的,这就是磁盘顺序写。

磁盘顺序写的性能很高,某种程度上来说,几乎可以跟内存随机读写的性能差不多,尤其是在数据库里其实也用了os cache机制,就是redo log顺序写入磁盘之前,先是进入了os cache,就是操作系统管理的内存管理中。

所以对这个写磁盘日志文件而言,最关注的是磁盘每秒读写多少数据量的吞吐量指标,,就是说每秒可以写入磁盘100MB数据和每秒可以写入磁盘200MB数据,对数据库的并发能力影响也是极大的

因为数据库的每一次更新SQL语句,都必然涉及到多个磁盘随机读取数据页的操作,也会涉及到一条redo log日志文件顺序写的操作。所以

  • 磁盘读写的IOPS指标,就是每秒可以执行多少个随机读写操作
  • 每秒可以读写磁盘的数据量的吞吐量指标,就是每秒可以写入多少redo log日志

这两个方面整体决定了数据库的并发能力和性能。

包括你磁盘日志文件的顺序读写的响应延迟,也决定了数据库的性能,因为你写redo log日志文件越快,那么你的SQL语句性能就越高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值