赞
踩
看完MySQL的底层结构图,很多人可能会有这样的疑问:
为什么MySQL不能直接更新磁盘上的数据而且设置这么一套复杂的机制来执行SQL呢?
因为如果每一个请求直接对MySQL数据文件进行读写,是随机IO,对于每次读写,机械硬盘都有寻道时间和旋转延迟,因此直接更新数据磁盘文件性能是比较低的,对于固态硬盘,也需要通过地址转换机制确定读写位置,所以直接更新磁盘文件是不能让数据库抗住很高并发的。
还有一个原因是修改量与磁盘刷新量严重不成比例,每更新一条记录需要将该记录所在的整个页面进行磁盘刷新。
MySQL这套机制看起来复杂,但它可以保证每个更新请求都是更新内存BufferPool
,然后顺序写日志文件,同时还能保证各种异常情况下的数据一致性。更新内存和顺序写磁盘上的日志文件的性能是非常高的,要远高于随机读写磁盘文件。
binlog
:是属于MySQL Server层的日志文件,记录的是所有对数据库进行增删改的操作(事件形式,二进制数据),主要用于恢复数据和主从复制。undo log
:InnoDB引擎特有的日志文件,记录的是逻辑操作
,例如进行insert
操作时,undo log会写入对应的delete
操作。主要用于事务回滚时恢复Buffer Pool缓存池里的数据。redo log
:InnoDB引擎特有的日志文件,记录的是物理操作
,例如页号1,偏移量10,写入了数据xxx。主要用于系统宕机重启后恢复Buffer Pool缓存池里还未写入磁盘的数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。