02|一条MySQL更新语句是如何执行的

news/2024/5/6 5:30:12/文章来源:https://blog.csdn.net/qq_23587709/article/details/126670531

02|一条MySQL更新语句是如何执行的

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

其实一条更新语句的执行操作和查询语句的执行操作基本相同->一条SQL查询语句是如何查询的?,唯一不同的是一条更新语句在执行过程中需要涉及到两个日志操作(redo log、binlog)。步骤如下:

  1. 连接器:建立一个链接

  2. 分析器:词法优化、语法优化

  3. 优化器:给出该条SQL语句执行方案

  4. 执行器:如下

  • 执行器先找引擎取 ID=2 这一行。ID 是主键,引擎直接用树搜索找到这一行。如果 ID=2 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。
  • 执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 N,现在就是 N+1,得到新的一行数据,再调用引擎接口写入这行新数据。
  • 引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。
  • 执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
  • 执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。

img

redo log

首先我们思考一个问题,那就是当我们每执行一条更新操作,MySQL是否都会将更新的数据立即写入磁盘?答案是:否

因为如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程 IO 成本、查找成本都很高。因此为了解决这个问题,MySQL设计者采用了WAL技术。具体来说就是当有一条记录需要更新时,InnoDB引擎就会先把这条记录写入到redo log中,并且更新内存,此时更新就算完成了。同时,InnoDB引擎会在合适的时候将记录写到磁盘中,而这个操作往往是在系统比较空闲的时候去做。

但是可能会存在一些问题,要是系统一直不空闲怎么办?redo log日志的容量是多大?

redo log日志容量是固定的,比如可以配置为一组 4 个文件,每个文件的大小是 1GB,那么这块日志总共就可以记录 4GB 的操作。当日志写不下了,那就会将最开始的那块日志更新到数据文件,同时对这块日志进行擦除,进而腾出空间继续写入。

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

binlog

MySQL 整体来看,其实就有两块:一块是 Server 层,它主要做的是 MySQL 功能层面的事情;还有一块是引擎层,负责存储相关的具体事宜。上面我们聊到的 redo log (重做日志)是 InnoDB 引擎特有的日志,而 Server 层也有自己的日志,称为 binlog(归档日志)。

这两种日志有以下三点不同。

  1. redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
  2. redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
  3. redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

两阶段提交

为什么需要两阶段提交呢?这是为了让两份日志之间的逻辑一致。

  • 先写 redo log 后写 binlog

当写完redo log日志后,binlog 还没有写完的时候,MySQL 进程异常重启。这个时候我们仍然可以通过redo log日志将数据恢复,这样看起来并没有什么问题。但是我们可以想一下,当我们之后备份数据的时候,备份的是bin log日志,如果需要用这个 binlog 来恢复临时库的话,由于这个语句的 binlog 丢失,这个临时库就会少了这一次更新,数据就会与原值不一致。

  • 先写binlog后写redo log日志

如果在 binlog 写完之后 crash,由于 redo log 还没写,崩溃恢复以后这个事务无效。但是 binlog 里面已经记录了该条修改日志。所以,在之后用 binlog 来恢复的时候就多了一个事务出来,与原库的数据不一致。

小结

  • Bin log 用于记录了完整的逻辑记录,所有的逻辑记录在 bin log 里都能找到,所以在备份恢复时,是以 bin log 为基础,通过其记录的完整逻辑操作,备份出一个和原库完整的数据。

  • redo log用于崩溃恢复,当MySQL崩溃重启以后,能够通过redo log将数据正确恢复到崩溃前的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_4975.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四、集合

四、集合 集合和数组区别 (1)数组定长,集合不定长(2)数组可存基础数据类型和引用类型,集合只能存引用类型 位置:java.util.*; 这是一位仁兄的笔记,师出同门,点我跳转~ 1、…

高级js 面向对象 和面向过程 三种函数

判断数据类型 // 创建一个Cat对象,属性:颜色,品种,行为:吃,跑,捉老鼠var Cat new Object() //new一个对象Cat.catys red //属性Cat.catname cat //对象名// 行为Cat.catxw function () {console.log("喜欢跑&…

Python3,我用这种方式讲解python模块,80岁的奶奶都说能理解。建议收藏 ~ ~

Python模块讲解1、引言2、python模块详解2.1 含义2.2 代码示例2.3 进阶3、总结1、引言 小屌丝:鱼哥,你看天上的月亮越来越圆了。 小鱼:唉~ 又是一年团圆夜,又是一年中秋节。 小屌丝:嘿嘿,可不滴&#xff0…

二维凸包问题

什么是二维凸包 假设墙上顶一组钉子,这些钉子的集合为X,我们用橡皮筋围住这些钉子,橡皮筋的形状就是凸包(来源于网络)。 向量的叉乘 对于两个向量pq⃗\vec{pq}pq​和qr⃗\vec{qr}qr​ 如果pq⃗\vec{pq}pq​和qr⃗\vec{qr}qr​的叉积结果大于0…

分销商城小程序开发运营逻辑是什么?

商城分销现在用的人比较多,其中用的最多的差不多就是二级分销、三级分销,除了这两种分销方式,还有一种是一级分销,不过裂变效果可能不如二级分销、三级分销要好,所以用的人不是特别的多。 二级分销跟三级分销的逻辑都差…

C++PrimerPlus跟读记录【第五章】循环和关系表达式

1、for 循环 for(initialization; test-expression; updata-expression)test-expression 关系表达式,结果强制为bool类型,true or false。 表达式和语句 C表达式是 值 或 值与运算符的组合,每个表达式都有值。表达式只要加上分号&#xff0…

剑指offer32-42字符串数组的应用

剑指 Offer II 032. 有效的变位词 给定两个字符串 s 和 t ,编写一个函数来判断它们是不是一组变位词(字母异位词)。t 是 s的变位词等价于「两个字符串不相等且两个字符串排序后相等」 注意:若 s 和 t 中每个字符出现的次数都相同…

QT QTextEdit富文本插入字体-表格-编号-图片-查找-语法高亮功能

QT QTextEdit富文本插入字体-表格-编号-图片与查找功能,输入char 自动变成蓝色-语法高亮功能 QTQTextEdit富文本插入字体-表格-编号-图片-查找-语法高亮功能.rar-QT文档类资源-CSDN下载QTQTextEdit富文本插入字体-表格-编号-图片-查找-语法高亮功能.rarhttps:/更多…

Vue使用脚手架(ref、props、mixin、插件、scoped)(七)

系列文章目录 第一章:Vue基础知识笔记(模板语法、数据绑定、事件处理、计算属性)(一) 第二章:Vue基础知识(计算属性、监视属性、computed和watch之间的区别、绑定样式)(…

四、 java的对象和类

四、 java的对象和类 对象(Object):对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。类(c…

物理服务器安装CentOS 7操作系统

目录 1、下载系统镜像 2、制作安装盘 2.1 方法一:光盘制作 2.2 方法二:U盘制作 3、更改bios启动顺序 4、安装CentOS 7操作系统 4.1 安装命令选择,及常见错误解决 4.2 语言选择 4.3 时区选择 4.4 软件选择 4.5 安装位置选择 4.6 手…

猿创征文|【C++游戏引擎Easy2D】学C++还不会绘制一个简单的二维图形?一篇文章教会你

🧛‍♂️iecne个人主页::iecne的学习日志 💡每天关注iecne的作品,一起进步 💪学C必看iecne 本文专栏:【C游戏引擎】. 🐳希望大家多多支持🥰一起进步呀! ✨前…

Apache Maven 3.6.0的下载安装和环境配置(详细图解+不限速下载链接)

标题工具/原料 apache-maven-3.6.0 下载地址 云盘不限速下载 或者进入官网按下图下载 方法/步骤一 安装 打开压缩包,将maven压缩包解压至软件安装处,建议D根目录或其他,记住安装位置 类似于 方法/步骤二 环境变量配置 变量 1.新建变…

Eolink 通过可信云权威认证,数据保护能力业内领先!

Eolink 正式通过由中国信息通信研究院组织发起的可信云评估考核,在数据安全保障领域获得权威认证,并荣获 “企业级 SaaS 服务” 认证证书。 在云时代,保护用户数据安全、预防隐私泄露是数字化企服厂商的重中之重。Eolink 作为一个 API 在线管…

计算机毕业设计ssm+vue基本微信小程序的个人健康管理系统

项目介绍 首先,论文一开始便是清楚的论述了小程序的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了小程序的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数…

IIC协议详解

文章目录1 IIC简介2 IIC物理层2.1 IIC硬件2.2 IIC协议特点3 IIC协议层4数据传输4.1 IIC写数据4.2 IIC读数据1 IIC简介 IIC(Inter-Integrated Circuit)总线是一种由 NXP(原 PHILIPS)公司开发的两线式串行总线, 用于连接微控制器及其…

s19.基于 Kubernetes v1.25.0(kubeadm) 和 Docker 部署高可用集群(一)

基于 Kubernetes v1.25.0 和 Docker 部署高可用集群 主要内容 Kubernetes 集群架构组成容器运行时 CRIKubernetes v1.25 新特性Kubernetes v1.24 之后不再支持 Docker 的解决方案Kubernetes v1.25 高可用集群架构基于 Kubernetes v1.25.0 和 Docker 部署高可用集群实战案例 …

Redis持久化机制分析

什么是持久化? 简单来说持久化就是将数据保存到磁盘,让即使服务宕机、重启、断电等操作后数据仍热存在,并且是完整的。 1、为什么要持久化? 1、Redis是一个内存数据库,宕机之后存储在内存的数据会消失。2、Redis重启…

传述最详细的干货,让简历面试不再成为你找工作的绊脚石

📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…

【蓝桥杯省赛真题37】Scratch三国演义字数统计 少儿编程scratch编程蓝桥杯省赛真题讲解

​​​​​​​ 目录 scratch三国演义字数统计 一、题目要求 编程实现 二、案例分析 1、角色分析