【MySQL】简单解析一条SQL更新语句的执行过程

news2025/1/19 21:44:52

1. 更新语句执行流程概述

在这里插入图片描述

在 MySQL 中,一条更新语句(如 update T set c=c+1 where ID=2)的执行涉及多个关键步骤,与查询语句类似,会经过连接器、分析器、优化器、执行器等 Server 层模块,最终到达存储引擎(如 InnoDB),且在执行过程中与 redo log 和 binlog 这两个重要日志模块紧密相关。

2. 各组件在更新语句执行中的作用

2.1. 连接器

连接器负责管理数据库连接与用户权限验证。在执行更新语句前,客户端需先连接数据库,此过程由连接器完成。

并且,一旦表有更新操作,连接器会清空该表相关的查询缓存,这也是不建议使用查询缓存的原因之一,因为缓存频繁失效会降低性能。

比如,在一个电商系统中,当频繁更新商品库存信息时,如果使用查询缓存,每次更新都会导致与商品表相关的缓存被清空,后续相同的查询就无法利用缓存,增加了数据库的查询压力。

2.2. 分析器

对 SQL 语句进行词法和语法解析,识别出这是一条更新语句,为后续的执行流程奠定基础。

若语句存在词法或语法错误,分析器会报错并终止执行。例如,若写成 update T set c+1 where ID=2(少了 c 的赋值部分),分析器会检测到语法错误并提示用户修改。

2.3. 优化器

决定执行更新操作所使用的索引,其目标是选择最优的执行计划,以提高更新操作的效率。

例如,在有主键 ID 的表 T 中更新数据时,优化器会判断使用 ID 索引来定位要更新的行。

就像在一个拥有大量用户数据的表中,如果要更新特定用户的信息,优化器会根据索引情况快速定位到该用户所在的数据页,减少数据查找的时间。

2.4. 执行器

具体执行更新操作。

首先,它会根据优化器的决策,通过引擎接口查找 ID = 2 的行。若该行所在的数据页已在内存中,则直接获取;否则,需从磁盘读入内存。

接着,执行器将获取到的行数据中 c 值加 1,并调用引擎接口写入新数据。

之后,执行器会生成该操作的 binlog,并写入磁盘,最后调用引擎的提交事务接口完成更新操作。

3. redo log 详解

3.1. 引入原因

我们用一个故事来解释一下这个问题。

在古代,酒馆掌柜一般会有一个粉板,专门用来记录客人的赊账记录。如果赊账的⼈不多,那么他可以把顾客名和账⽬写在板上。但如果赊账的⼈多了,粉板总会有记不下的时候,这个时候掌柜⼀定还有⼀个专⻔记录赊账的账本。

如果有⼈要赊账或者还账的话,掌柜⼀般有两种做法:⼀种做法是直接把账本翻出来,把这次赊的账加上去或者扣除掉;另⼀种做法是先在粉板上记下这次的账,等打烊以后再把账本翻出来核算。

在⽣意红⽕柜台很忙时,掌柜⼀定会选择后者,因为前者操作实在是太麻烦了。⾸先,你得找到这个⼈的赊账总额那条记录。你想想,密密麻麻⼏⼗⻚,掌柜要找到那个名字,可能还得带上⽼花镜慢慢找,找到之后再拿出算盘计算,最后再将结果写回到账本上。

这整个过程想想都麻烦。相⽐之下,还是先在粉板上记⼀下⽅便。你想想,如果掌柜没有粉板的帮助,每次记账都得翻账本,效率是不是低得让⼈难以忍受?

在 MySQL ⾥也有这个问题,如果每⼀次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程 IO 成本、查找成本都很⾼。为了解决这个问题,MySQL 的设计者就⽤了类似酒馆掌柜粉板的思路来提升更新效率。这个就是 MySQL ⾥经常说到的 WAL 技术。

3.2. WAL 技术说明

WAL 的全称是 Write-Ahead Logging,它的关键点就是先写⽇志,再写磁盘。

当有⼀条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log ⾥⾯,并更新内存,这个时候更新就算完成了。

InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘⾥⾯,⽽这个更新往往是在系统⽐较空闲的时候做。

比如在一个高并发的在线交易系统中,大量的订单数据更新操作如果都直接写磁盘,会严重影响系统性能。采用 WAL 机制后,先将更新记录到 redo log,能快速响应交易请求,提升系统的吞吐量和响应速度。

3.3. redo log 结构与循环写机制

在这里插入图片描述

redo log 是固定大小的,可配置为一组多个文件(如 4 个文件,每个文件 1GB,共 4GB),采用循环写的方式。

有两个关键指针,write pos 表示当前记录的位置,一边写一边后移,写到末尾则回到开头循环;checkpoint 是当前要擦除的位置,也是循环推移的。

write poscheckpoint 之间的空间用于记录新操作,当 write pos 追上 checkpoint 时,表示 redo log 已满,此时需先擦掉部分记录,推进 checkpoint 后才能继续执行新的更新操作。

假设一个数据库系统的 redo log 配置为上述大小,在业务高峰期,大量的更新操作可能会使 write pos 快速接近 checkpoint。当两者接近时,系统会暂停新的更新,先将部分记录从 redo log 同步到磁盘,移动 checkpoint,为新的更新操作腾出空间,确保系统的持续运行。

3.4. crash-safe 能力

redo log 保证了即使数据库发生异常重启,之前提交的记录也不会丢失,此能力称为 crash-safe。

因为只要记录在 redo log 或已同步到磁盘中,系统就能在重启后恢复数据,如同酒店掌柜即使停业几天,仍可通过账本和粉板上的数据明确赊账账目。

例如,在一次数据库服务器突然断电的情况下,重启后系统可以根据 redo log 中的记录恢复到断电前的状态,保证数据的完整性和一致性。

4. binlog 详解

4.1. 与 redo log 的区别

4.1.1. 所属层次与引擎通用性

redo log 是 InnoDB 引擎特有的日志,而 binlog 是 MySQL 的 Server 层实现的,所有引擎都可使用。

由于 MySQL 历史发展过程中,早期自带的 MyISAM 引擎没有 crash-safe 能力,binlog 仅用于归档。

后来引入 InnoDB 引擎后,为实现 crash-safe 能力,InnoDB 使用了 redo log,但 binlog 依然保留其在 Server 层的作用。

在一个同时使用了 MyISAM 和 InnoDB 引擎的数据库系统中,binlog 可以统一记录所有引擎的逻辑操作,而 redo log 则仅服务于 InnoDB 引擎的事务安全和数据恢复。

4.1.2. 记录内容性质

redo log 是物理日志,记录的是在某个数据页上做了什么修改。

binlog 是逻辑日志,记录的是语句的原始逻辑,例如 给 ID=2 这一行的 c 字段加 1

比如执行 update T set c=c+1 where ID=2 语句,redo log 会记录数据页中 ID=2 这一行数据的具体修改细节,如某个字节的变化;而 binlog 则记录 update T set c=c+1 where ID=2 这个完整的语句逻辑。

4.1.3. 写入方式

redo log 是循环写,空间固定会用完。

binlog 是可以追加写入的,即文件写到一定大小后会切换到下一个文件,不会覆盖以前的日志。

在长期运行的数据库系统中,redo log 可能会因为循环写而覆盖早期的记录,但 binlog 则会持续保存所有的历史逻辑操作,这对于数据的长期归档和审计非常重要。

4.2. 在数据恢复中的作用

binlog 用于记录所有的逻辑操作,且采用追加写形式。

在数据恢复场景中,DBA 通常会定期做全量备份(备份周期取决于系统重要性,可为一天一备或一周一备等),同时保存最近半个月的所有 binlog。

当需要恢复到指定某一秒时,先找到最近的全量备份恢复到临时库,再从备份时间点开始,依次取出 binlog 重放到误操作之前的时刻,使临时库与误删之前的线上库一致,最后可按需将数据恢复到线上库。

例如,在一个企业级的数据库应用中,如果误删除了某个重要表的数据,DBA 可以利用最近的全量备份和相应时间段的 binlog,将数据恢复到误删前的状态,最大程度减少数据损失。

5. 两阶段提交

5.1. 引入原因

有了上面针对 redo log 和 binlog 的概念性理解,我们再来看执⾏器和 InnoDB 引擎在执⾏这个简单的 update 语句 update T set c=c+1 where ID=2 时的内部流程。

  1. 执⾏器先找引擎取 ID=2 这⼀⾏。ID 是主键,引擎直接⽤树搜索找到这⼀⾏。如果 ID=2 这

⼀⾏所在的数据⻚本来就在内存中,就直接返回给执⾏器;否则,需要先从磁盘读⼊内存,

然后再返回。

  1. 执⾏器拿到引擎给的⾏数据,把这个值加上 1,⽐如原来是 N,现在就是 N+1,得到新的⼀

⾏数据,再调⽤引擎接⼝写⼊这⾏新数据。

  1. 引擎将这⾏新数据更新到内存中,同时将这个更新操作记录到 redo log ⾥⾯,此时 redo

log 处于 prepare 状态。然后告知执⾏器执⾏完成了,随时可以提交事务。

  1. 执⾏器⽣成这个操作的 binlog,并把 binlog 写⼊磁盘。

  2. 执⾏器调⽤引擎的提交事务接⼝,引擎把刚刚写⼊的 redo log 改成提交(commit)状态,

更新完成。

下面用图片描述一下上述流程,图中浅⾊框表示是在 InnoDB 内部执⾏的,深⾊框表示是在执⾏器中执⾏的。

在这里插入图片描述

从上图应该可以看出来,我们将 redo log 的写入拆成了两个步骤:prepare 和 commit,这就是“两阶段提交”。

5.2. 两阶段提交的必要性

为保证 redo log 和 binlog 之间的逻辑一致性。

若不采用两阶段提交,无论是先写 redo log 再写 binlog,还是先写 binlog 后写 redo log,在发生崩溃时都可能导致数据库状态与用日志恢复出来的库状态不一致。

例如,执行 update T set c=c+1 where ID=2 时,假设当前 c 值为 0,若先写 redo log 后写 binlog,在 redo log 写完但 binlog 未写完时崩溃,恢复后原库 c 值为 1,但 binlog 丢失该语句,用 binlog 恢复临时库时 c 值为 0。

反之,先写 binlog 后写 redo log,binlog 写完 redo log 未写时崩溃,原库 c 值为 0,而用 binlog 恢复时 c 值为 1,均出现不一致情况。

在一个分布式数据库系统中,多个节点同时进行更新操作,如果不采用两阶段提交保证日志一致性,可能会导致节点间数据不一致,影响整个系统的正常运行。

6. 最后建议

redo log ⽤于保证 crash-safe 能⼒。innodb_flush_log_at_trx_commit 这个参数设置成 1 的时候,表示每次事务的 redo log 都直接持久化到磁盘。这个参数我建议你设置成 1,这样可以保证 MySQL 异常重启之后数据不丢失。

sync_binlog 这个参数设置成 1 的时候,表示每次事务的 binlog 都持久化到磁盘。这个参数我也建议你设置成 1,这样可以保证 MySQL 异常重启之后 binlog 不丢失。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#与AI的共同发展

C#与人工智能(AI)的共同发展反映了编程语言随着技术进步而演变,以适应新的挑战和需要。自2000年微软推出C#以来,这门语言经历了多次迭代,不仅成为了.NET平台的主要编程语言之一,还逐渐成为构建各种类型应用程序的强大工具。随着时…

mono3d汇总

lidar坐标系 lidar坐标系可以简单归纳为标准lidar坐标系和nucense lidar坐标系&#xff0c;参考链接。这个坐标系和车辆的ego坐标系是一致的。 标准lidar坐标系 opendet3d&#xff0c;mmdetection3d和kitt都i使用了该坐标系 up z^ x front| /| /left y <------ 0kitti采…

支持向量机算法(三):非线性支持向量原理层层拆解,精读公式每一处细节

支持向量机算法&#xff08;一&#xff09;&#xff1a;像讲故事一样讲明白它的原理及实现奥秘-CSDN博客 支持向量机算法&#xff08;二&#xff09;&#xff1a;层层拆解&#xff0c;精读公式每一处细节-CSDN博客 支持向量机算法&#xff08;一&#xff09;、算法&#xff0…

LLM - 大模型 ScallingLaws 的迁移学习与混合训练(PLM) 教程(3)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145212097 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Scalin…

数据可视化:让数据讲故事的艺术

目录 1 前言2 数据可视化的基本概念2.1 可视化的核心目标2.2 传统可视化手段 3 数据可视化在知识图谱中的应用3.1 知识图谱的可视化需求3.2 知识图谱的可视化方法 4 数据可视化叙事&#xff1a;让数据讲故事4.1 叙事可视化的关键要素4.2 数据可视化叙事的实现方法 5 数据可视化…

数据库开发支持服务

文章目录 前言适用产品服务范围前提条件责任矩阵交互项目 服务流程交付件项目完成标志 前言 数据库开发支持服务是为了达成客户业务系统开发、测试、上线运行提供的具体技术支撑&#xff0c;内容包括数据库开发指导、性能调优、第三方平台对接支持、应用对接与上线支持等。数据…

2024年,我的技术探索与成长之路

2024年&#xff0c;我的技术探索与成长之路 2024年已经过去&#xff0c;作为一名技术爱好者和写作者&#xff0c;我回顾了过去一年在博客上记录的点滴&#xff0c;感慨良多。这一年&#xff0c;我不仅见证了技术的飞速发展&#xff0c;也在不断学习和实践中找到了自己的成长方向…

机器学习经典无监督算法——聚类K-Means算法

目录 算法原理 算法步骤 算法API 算法导入 API参数理解 算法实现 算法原理 Kmeans 算法是一种无监督的聚类算法&#xff0c;目的是将数据集中的样本划分到 K 个不同的簇中。 聚类&#xff1a;将数据集中相似的数据点归为一组或一个簇的过程。 数据集&#xff1a;一组相…

【MySQL索引:B+树与页的深度解析】

文章目录 MySQL索引&#xff1a;B树与页的深度解析1. 索引使用的数据结构——B树1.1 B树介绍1.2 B树的特点1.3 B树和B树的对比 2. MySQL中的页2.1 页的介绍2.2 页主体2.3 页目录2.4 B树在MySQL索引中的应用 MySQL索引&#xff1a;B树与页的深度解析 在MySQL数据库中&#xff0…

新阿里云买服务器配置需手动配置80端口

新买阿里云服务器需手动配置80&#xff0c;端口才可以访问nginx CentOS系统 安装nginx 1. 安装 Nginx yum install nginx 2. 启动 Nginx 服务 systemctl start nginx 3. 修改默认网页 cd /usr/share/nginx/ echo "666" >index.html cat index.html 访问ngin最后…

机器学习——什么是代价函数? 下

“上次课讲了机器学习的模型表示,讲了一个线性模型的例子,那怎样在可能的拟合直线里选择一条最合适的呢?有没有数学的方法让这个直线合适还是不合适变得可以量化呢?这就要说代价函数了。” 本次课前半段内容非常简单,带领我们一起复习初中平面几何的知识,后半段给出了代价…

LeetCode - #187 Swift 实现重复的DNA序列

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

ReactiveReactor Core

Reactive&Reactor Core 一、概述1、问题2、优势3、发展 二、Reactive Streams1、依赖2、API 三、Project Reactor1、概述2、并发模型3、入门1、依赖2、Flux和Mono3、空流&错误流 4、订阅响应式流1、常见订阅2、自定义订阅 5、API1、index2、timestamp3、any4、map5、fi…

STL容器-- list的模拟实现(附源码)

STL容器-- list的模拟实现&#xff08;附源码&#xff09; List的实现主要考察我们对list这一容器的理解&#xff0c;和代码的编写能力&#xff0c;通过上节对list容器的使用&#xff0c;我们对list容器已经有了一些基本的了解&#xff0c;接下来就让我们来实现一些list容器常见…

【转】厚植根基,同启新程!一文回顾 2024 OpenHarmony 社区年度工作会议精彩瞬间

在数字化浪潮奔腾不息的今天&#xff0c;开源技术已成为推动科技创新与产业发展的强大引擎。2025年1月10日-11日&#xff0c;OpenAtom OpenHarmony&#xff08;开放原子开源鸿蒙&#xff0c;以下简称“OpenHarmony”或“开源鸿蒙”&#xff09;社区2024年度工作会议于深圳盛大启…

蓝桥杯备考:堆和priority queue(优先级队列)

堆的定义 heap堆是一种特殊的完全二叉树&#xff0c;对于树中的每个结点&#xff0c;如果该结点的权值大于等于孩子结点的权值&#xff0c;就称它为大根堆&#xff0c;小于等于就叫小根堆&#xff0c;如果是大根堆&#xff0c;每个子树也是符合大根堆的特征的&#xff0c;如果是…

力扣682

from typing import Listclass Solution:def calPoints(self, operations: List[str]) -> int:a [] # 用于存储有效得分的列表for op in operations:if op.isdigit() or (op[0] - and op[1:].isdigit()): # 如果是整数&#xff08;包括负数&#xff09;a.append(int(op)…

考研计算机组成原理——零基础学习的笔记

第一章 研究计算机硬件的学科。 1.计算机系统概述 计算机系统硬件软件&#xff08;系统软件&#xff1a;比如操作系统、数据库管理系统、标准程序库等&#xff0c;应用软件&#xff1a;QQ等&#xff09; 1.2计算机的层次结构 1.2.1计算机硬件的基本组成 冯诺伊曼计算机&a…

海康工业相机的应用部署不是简简单单!?

作者&#xff1a;SkyXZ CSDN&#xff1a;SkyXZ&#xff5e;-CSDN博客 博客园&#xff1a;SkyXZ - 博客园 笔者使用的设备及环境&#xff1a;WSL2-Ubuntu22.04MV-CS016-10UC 不会吧&#xff1f;不会吧&#xff1f;不会还有人拿到海康工业相机还是一脸懵叭&#xff1f;不会还有人…

计算机网络 (49)网络安全问题概述

前言 计算机网络安全问题是一个复杂且多维的领域&#xff0c;它涉及到网络系统的硬件、软件以及数据的安全保护&#xff0c;确保这些元素不因偶然的或恶意的原因而遭到破坏、更改或泄露。 一、计算机网络安全的定义 计算机网络安全是指利用网络管理控制和技术措施&#xff0c;保…