首页 > 其他 > 详细

update语句执行流程

时间:2020-09-05 17:41:25      阅读:146      评论:0      收藏:0      [点我收藏+]

 

执行语句

update T set c=c+1 where ID=2;

 

技术分享图片

 

 

redo log(重做日志)

作用:

  1.提高写入性能;

  2.实现事务的一致性(两阶段提交)。

MySQL里经常说到的 WAL 技术,WAL 的全称是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘。

本人最开始这里理解,日志就是缓存,其实不然。日志也是文件,虽然redo log有redo log buffer,但是这里是持久化的文件写入。

那么问题来了,都是io操作,都写入了,如何提升性能的呢?

主要点在于写入磁盘这个操作。即一个update写入磁盘的操作是相当复杂的,就拿其中的索引更新,由于是B+树索引,相对其他的结构,新增和删除操作,时间复杂度很高,需要根据不同的算法对索引进行旋转和拆分。

所以一个update过来,MySQL只是对其记下来,后续的一系列操作稍后一起做,这样就极大的提高了写入性能。

 

binlog(归档日志)

实名二进制日志(binary log),记录了对MySQL数据库执行更改的所有操作,但是不包括SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改。然后,若操作本身没有导致数据库发生变化,那么该操作可能也会写入二进制日志。

二进制日志主要有以下几种作用:

1.恢复(recovery):某些数据的恢复需要二进制日志,例如,在一个数据库全备文件恢复后,用户可以通过二进制日志进行point-in-time的恢复。

2.复制(replication):其原理与恢复类似,通过复制和执行二进制日志使一台远程的MySQL数据库(一般称为slave或standby)与一台MySQL数据库(一般称为master或primary)进行实时同步。

3.审计(audit):用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击。

 

redo log与binlog的不同点:

1.redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。

2.redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。

3.redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

 

两阶段提交:

目的就是让这两个状态保持逻辑上的一致。ACID的“C”。

 

后续写redo log和binlog的缓存。

 

上述内容林晓斌老师“MySQL实战45讲”的笔记,有兴趣的同学可以看下。

https://time.geekbang.org/column/article/68319

 

update语句执行流程

原文:https://www.cnblogs.com/lanbitou-java/p/13618626.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!