首先创建一张表;

create table T(ID int primary key,c int);

如果要更新ID=2这行+1;应该这样写

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

执行这句操作首先还是要与数据库建立连接这是连接器的工作。
在一个表进行更新操作时,这张表的缓存就会失效。

接下来分析器会对这条跟新语句进行语法和词法分析,如果有问题就会报错提示。然后优化器会决定使用ID的索引情况,最后执行器负责执行,找到这行然后更新。

与查询操作不同的是,更新操作涉及到两个重要的日志模块。redo log(重做日志),bin log(归档日志)。如果接触到MySQL这两个日志是必学的。

redo log

如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后在更新,这个过程IO成本、查找成本都很高。为了解决这个问题,MySQL的设计者就用了类似于酒店掌柜的黑板记录来提升效率。
WAL技术简称Write-Ahead Logging ,他的关键就是先写日志再写磁盘。写磁盘的时间并不是固定的,他是等到系统比较空闲的时候才写入磁盘。

当一条记录需要更新的时候,InnoDB引擎就会把记录写进redo log里面,并更新内存。这个时候就算更新完成了。同时,InnoDB引擎会在适当的时候将这个操作记录更新到磁盘中。

还有需要注意的是,InnoDB的redo log 是固定大小的,比如以组分为4个文件,每个文件大小是1GB,那么这个日子就可以记录4GB的操作。从头开始写,写到结尾再从头开始写。是一个循环。

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

要理解crash-safe这个概念,可以想象赊账的例子,只要赊账记录在了黑板上或卸载账本上,即使店长忘记了,但也有黑板上或账本上的明确数目。

bin log

上面所说的redo log 是InnoDB引擎独有的日志,而Server层也有自己的日志,称为bin log(归档日志)。

其实bin log日志出现的时间比redo log早,因为最开始MySQL是没有InnoDB存储引擎的,5.5之前是MyISAM。但是MyISAM没有crash-safe的能力,binlog日志只能永固归档。而InnoDB是另一个公司使用的一套日志系统来实现crash-safe能力。

两种日志的区别

  1. redo log 是InnoDB独有的;bing log 是MySQL的Server层实现的,所有引擎都可以使用。
  2. redo log 是物理日志,记录的是在某个数据页改动了哪些;bin log 是逻辑日志,记录的是SQL语句具体操作。
  3. redo log 是循环写的,空间固定会用完;binlog是可以追加写入的。追加写是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

update语句内部流程

  1. 执行器先找到引擎ID=2这行,ID是主键,引擎直接用树搜索找到这一行。如果ID=2这行数据被就在内存中那就不需要再调入内存直接返回给执行器;否则需要先从磁盘读入内存,然后再返回。
  2. 执行器拿到引擎给的行数据,把行值+1,得到新的一行数据,在调用引擎接口写入这行新数据。
  3. 引擎将这行新数据更新到内存中,同时将这个更新操作记录到redo log里面,此时redo log处于prepare状态。然后告知执行器执行完成了,随时可以提交事务。
  4. 执行器生成这个操作的bin log,并把bin log 写入磁盘。
  5. 执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log改成提交状态,更新完成。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图中浅绿色的是在InnoDB引擎中执行的,墨绿色是在Server层完成的。

如果不使用“两阶段提交”,那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致。

MySQL45讲:一条update语句是怎样执行的的更多相关文章

  1. 如何将多条update语句合并为一条

    需求: 如何将多条update语句合并为一条update语句:如,update table1 set col='2012' where id='2014001'      update table1  ...

  2. Sql Server执行一条Update语句很慢,插入数据失败

    今天同事要我修改服务器数据库里面的2条数据,查看服务器上的SQL Server数据库的时候,发现这几天数据没有添加成功,然后发现磁盘很快就满了,执行Update语句时,执行半天都提示还在执行,查询语句 ...

  3. 完蛋,公司被一条 update 语句干趴了!

    大家好,我是小林. 昨晚在群划水的时候,看到有位读者说了这么一件事. 在这里插入图片描述 大概就是,在线上执行一条 update 语句修改数据库数据的时候,where 条件没有带上索引,导致业务直接崩 ...

  4. 一条update语句到底加了多少锁?带你深入理解底层原理

    迎面走来了你的面试官,身穿格子衫,挺着啤酒肚,发际线严重后移的中年男子. 手拿泡着枸杞的保温杯,胳膊夹着MacBook,MacBook上还贴着公司标语:"我爱加班". 面试开始,直 ...

  5. MySQL:一条更新语句是如何执行的

    目录 引言 更新流程图 更新流程说明 第一步:更新数据 数据页内存 Change Buffer 第二步:缓存日志内容 redo log buffer binlog cache 第三步:日志写入磁盘 两 ...

  6. 一条 SQL 语句是如何执行的

    一条 SQL 语句是如何执行的 SQL查询语句 select * from user where ID=10; MySQL 的基本架构可以分为 Server 层和存储引擎两部分.Server 层又包含 ...

  7. 一条SQL语句是如何执行的?--Mysql45讲笔记记录 打卡day1

    写在前面的话:回想以前上班的时候,空闲时间还是挺多的,但是都荒废了.如今找工作着实费劲了.但是这段时间在极客时间买了mysql45讲,就好像发现了新大陆一样,这是我认真做笔记的第一天,说实话第一讲我已 ...

  8. sql执行万条update语句优化

    几个月没有更新笔记了,最近遇到一个坑爹的问题,顺道记录一下.. 需求是这样的:一次性修改上万条数据库. 项目是用MVC+linq的. 本来想着用 直接where() 1 var latentCusto ...

  9. 用一条UPDATE语句交换两列的值

    在SQL UPDATE语句中,"="右侧的值在整个UPDATE语句中都是一致的,所有更新同时发生!因此以下语句将在没有临时变量的情况下交换两列的值: UPDATE table SE ...

随机推荐

  1. TMOOC-1692-分西瓜

    题目 描述 今天是阴历七月初五,首师大附中信息社团队员GDC的生日.GDC正在和SCX.WXY在首师大附中集训.他想给这两位兄弟买点什么庆祝生日,经过调查,GDC发现SCX和WXY都很喜欢吃西瓜,而且 ...

  2. GYM101889J Jumping frog

    突然发现题刷累了写写题解还是满舒服的 题目大意: 给你一个只包含 \(R\) , \(P\) ,长度为 \(n\) 的字符串( \(3\le n\le 10^5\) ).你可以选择一个跳跃距离 \(l ...

  3. tensorflow学习笔记——DenseNet

    完整代码及其数据,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote 这里结合网络的资料和De ...

  4. C++异常之二 基本语法

    2. 异常处理的基本语法 下面是一个基本的代码例子,说明 throw.try.catch的基本用法,与 catch 的类型自动匹配: 1 #include <iostream> 2 #in ...

  5. CSS-backgroound和radial-giadient的常见用法

    前言 这里主要介绍下css中background和radial-giadient径向渐变的使用,工作中用到的地方可能也不太多,但是每次用到了都需要查阅官网,查资料就比较麻烦,这里记录一下我自己整理的常 ...

  6. Pytest 学习(二十五)- 解决pytest参数化测试标题都一样问题

    前言 使用参数化测试化后,allure的报告如下显示: 源代码如下: # -*- coding: utf-8 -*- # @Time : 2020/12/13 17:27 # @Author : lo ...

  7. docker redis 设置和使用

    1 开启docker 拉取redis镜像 1.1 桌面版docker   在镜像所在位置命令行执行 docker load -i redis.tar 1.2 开启redis docker run -p ...

  8. python 爬虫库安装

    一键安装python爬虫库 pip3 install requests selenium beautifulsoup4 pyquery pymysql pymongo redis flask djan ...

  9. css精髓:这些布局你都学废了吗?

    前言 最近忙里偷闲,给自己加油充电的时候,发现自己脑海中布局这块非常的凌乱混杂,于是花了一些时间将一些常用的布局及其实现方法整理梳理了出来,在这里,分享给大家. 单列布局 单列布局是最常用的一种布局, ...

  10. Docker跑项目中常见的中间件

    声明: 本章只作为记录 前端时间跑项目,发现每次都需要启动大量的中间件.在Windows 上启动特别麻烦 就想着写篇文章总结一下,把所有的 中间件全放服务器上启动 ,下次 直接复制黏贴命令就好了. 例 ...