Mysql基础(三)日志

redo log(重做日志)

InnoDB引擎实现的日志,提供了崩溃恢复能力(crash-safe)
WAL 技术,WAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘

         redo log日志的作用就是临时记录下更新内容,之后找时间写入磁盘(写日志其实也是写磁盘)。
         我没想到更好的例子,这沿用专栏里的例子:记账。

	 一个餐馆里,饭点,正是忙的时候,有老顾客提出记账,月底结,这个时候
要是拿出账本,找到这个顾客之前的记录,肯定不行,所以老板就备了一块黑板,
在忙的时候随时在上面记上一笔,某某赊账20,继续忙去了,过了饭点,空了下
来,老板才拿出账本,核对黑板上的记录,核对一条,擦去一条。
但是黑板上的位置是固定的,当赊账的人多了,黑板已经记不下了,这个时候只能
停下手头工作,拿出账本,先将一部分记录更新到账单上,腾出黑板的一部分空间
后,继续忙活。

在这里插入图片描述
图中可以看到这个空间是固定的,且被划分成4块(大小可以自己设置),绿色区域是空白区域可以记录新的操作。redo log被写满的时候,mysql停止更新操作,write pos 和 check point在同一个位置,之后check point往后推(当作黑板擦),经过的地方都会被写入磁盘,这个时候write pos和check point之间又有了一片空白的区域(图是为了便于理解,老师特地画成了一个圆形)。

同样都要写磁盘,写日志和写磁盘有什么区别?
写日志是顺序写,写磁盘是随机写(随机IO效率十分差,在传统的机械磁盘的系统中,每个磁盘寻道大约需要10毫秒)。

PS:顺序IO与随机IO待深入了解

binlog(归档日志)

mysql自带的日志。
与redo log不同的是,它没有固定大小(不是在一个文件上一直写,在到达一定大小后,会切换到下一个文件,不会覆盖以前的文件)。

更新详细流程

在这里插入图片描述

  1. 在引擎层的内存中查询记录,存在,直接返回执行器;不存在,从磁盘读入内存,再返回执行器
  2. 在返回记录的修改字段上做计算,产生新行(注意:产生新行,不是在之前的记录上变更),调用引擎接口写入这行新数据。
  3. 将新行写入内存,同时更新redo log,变更状态为prepare。然后告知执行器执行完成了,随时可以提交事务。
  4. 执行器生成该操作的binlog,并写入磁盘。
  5. 执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。

疑问:为什么执行器不修改原纪录行,而是产生新行,是不老师讲错了?

参考:极客时间 Mysql45讲专栏 作者:林晓斌, 网名"丁奇",腾讯云数据库负责人

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值