mysql更新一条语句_MySQL一条更新语句是如何执行的

一条查询语句是经过连接器 分析器 优化器 执行器等功能模块,最后到达存储引擎。

1e2aaaa1b418

image

以下所说的都基于InnoDb引擎。

当有一条记录需要更新的时候,InnoDB引擎会先把记录写到redo log里面,并更新内存,这个时候更新就算完成了。InnoDb引擎会在适当的时候把记录更新到硬盘里,往往是在系统比较空闲的时候。

如果内存满了,就只能先写到内存里面。

InnoDB的redo log是固定大小的。从头开始写,写到末位又循环回到开头写

1e2aaaa1b418

image

write pos 是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件开头。checkpoint 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。

write pos 和 checkpoint 之间的是“粉板”上还空着的部分,可以用来记录新的操作。如果 write pos 追上 checkpoint,表示“粉板”满了,这时候不能再执行新的更新,得停下来先擦掉一些记录,把 checkpoint 推进一下。

有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe

binlog

MySQL主要分两层,Server层和引擎层。Server层的日志成为binlog。

binlog是逻辑日志,记录了语句的原始逻辑。

binlog是可以追加写入的,到了一定大小可以换一个文件继续写。

update语句的内部流程:

1、执行器先找引擎取ID=2的这一行。ID是主键,引擎直接用树找到这一行。

2、执行器拿到引擎给的行数据,给这个值+1,得到新的一行数据,再调存储引擎写入这行新数据。

3、引擎将新数据更新到内存,同时将这个更新记录记录到redo log。redolog处于prepare状态,告知执行器执行完成,可以提交事务

4、执行器生成操作的binlog,写入磁盘

5、执行器调用引擎的提交事务接口,引擎把redolog改成commit状态,更新完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值