MySQL在实际工作时候的两种数据读写机制:
对redo log、binlog这种日志进行的磁盘顺序读写对表空间的磁盘文件里的数据页进行的磁盘随机读写 1 磁盘随机读
MySQL执行增删改操作时,先从表空间的磁盘文件里读数据页出来, 这就是磁盘随机读。
如下图有个磁盘文件,里面有很多数据页,可能需要在一个随机位置读取一个数据页到缓存,这就是磁盘随机读
因你要读取的这个数据页,可能在磁盘的任一位置,所以你在读取磁盘里的数据页时,只能用随机读。磁盘随机读性能极差,所以不可能每次更新数据都磁盘随机读,而是读取一个数据页之后,放到BP的缓存,下次要更新时,直接更新BP里的缓存页。
磁盘随机读的性能指标 IOPS底层的存储系统可执行多少次磁盘读写操作/s。压测时可以观察一下。对数据库的crud操作的QPS影响非常大,某种程度上几乎决定了你每秒能执行多少个SQL语句,底层存储的IOPS越高,你的数据库的并发能力就越高。
磁盘随机读写操作的响应延迟也是对数据库的性能有很大的影响。
假设你的底层磁盘支持你执行200个随机读写操作/s,但每个操作是耗费10ms,还是耗费1ms,也有很大影响, 决定你对数据库执行的单个crud SQL语句的性能。
包括你磁盘日志文件的顺序读写的响应延迟,也决定DB性能,因为你写redo log日志文件越快,那你的SQL性能越高。
比如你一个SQL语句发过去,磁盘要执行随机读操作加载多个数据页,此时每个磁盘随机读响应时间50ms,可能SQL语句要执行几百ms,但若每个磁盘随机读仅耗10ms,可能你的SQL就执行100ms即可。所以核心业务的数据库的生产环境机器推荐SSD,其随机读写并发能力和响应延迟要比机械硬盘好太多,可大幅提升数据库的QPS和性能。
2 磁盘顺序读写当你在BP的缓存页里更新数据后,必须要写条redo log日志,它就是顺序写:在一个磁盘日志文件里,一直在末尾追加日志
写redo log时,不停的在一个日志文件末尾追加日志的,这就是磁盘顺序写。
磁盘顺序写的性能很高,几乎和内存随机读写的性能差不多,尤其是在DB里也用了os cache机制,就是redo log顺序写入磁盘之前,先是进入os cache,即os管理的内存缓存。
对写磁盘日志文件,最关注
磁盘每s读写数据量的吞吐量指标即每s可写入多少redo log日志,整体决定DB的并发能力和性能。
每s可写入磁盘100M数据和每s可写入磁盘200M数据,对数据库的并发能力影响也大。因为数据库的每次更新SQL,都涉及:
多个 磁盘随机读取数据页操作一条redo log日志文件顺序写操作