MySQL高级(二):一条更新语句是如何执行的
执行步骤
1. 解析 SQL 语句
MySQL 首先会解析你输入的 UPDATE
语句。解析器会检查语法是否正确,并将 SQL 语句转化为内部的数据结构(通常是语法树)。
示例 SQL 语句:
UPDATE employees SET salary = 5000 WHERE department = 'Sales';
2. 查询优化
MySQL 会根据查询优化器来决定如何高效执行该更新操作。优化器会生成不同的执行计划并选择最优的执行路径。这一步对于 UPDATE
语句通常意味着决定如何检索要更新的记录,以及使用哪些索引(如果有的话)。
- 如果
WHERE
子句中有索引,优化器会考虑使用索引来提高查询速度。 - 如果没有索引,可能会进行全表扫描。
3. 确定要更新的记录
在执行 UPDATE
操作时,MySQL 会根据 WHERE
子句来确定哪些记录需要被更新。在这个过程中,MySQL 会:
- 使用索引(如果有的话)查找符合条件的记录。
- 如果没有索引,则会全表扫描,逐行检查。
4. 锁定涉及的行
为了保证数据一致性,MySQL 会在对数据进行更新时使用锁机制,防止其他事务修改同一行数据。这可以是行级锁或表级锁,具体取决于存储引擎(例如 InnoDB)以及事务的隔离级别。
- InnoDB 存储引擎:通常使用行级锁。
- MyISAM 存储引擎:使用表级锁。
5. 执行更新
MySQL 会在符合条件的记录上执行更新操作。它会计算新的字段值,并将其写入数据页。这个步骤涉及以下几个方面:
- 修改数据页:更新操作会修改数据页中的内容。
- 记录日志:MySQL 会将更新操作记录到事务日志(如
redo log
或binlog
),以便后续的事务恢复或复制。
6. 提交或回滚事务
如果更新操作是在事务中进行的:
- 如果事务提交,更新会被永久保存。
- 如果事务回滚,所有更新会被撤销。
在 InnoDB 存储引擎中,更新操作是通过“日志”的方式确保可恢复性的,即使系统崩溃也可以恢复到一致的状态。
7. 提交更新(对于非事务型存储引擎)
对于非事务型存储引擎(如 MyISAM),MySQL 会立即将更新写入磁盘,不需要提交事务。
redo log 和 binlog
在 MySQL 中,redo log 和 binlog 都是用于事务日志记录的重要机制。
redo log
Redo Log(重做日志)是 MySQL InnoDB 存储引擎使用的一种日志类型,它主要用于确保事务的持久性(即 ACID 中的 Durability)和故障恢复。Redo Log 记录了所有对数据库的修改操作,这些修改是为了能够在系统崩溃后,保证数据的一致性和恢复。
特点
- 事务日志:Redo log 记录的是事务执行过程中对数据页的修改操作,确保即使数据库发生崩溃,也可以通过 redo log 恢复数据。
- 物理日志:Redo log 记录的是物理层面的变化,即实际的数据修改操作(如页的更新、插入或删除行等),并不像 binlog 记录的是 SQL 语句。
- 日志缓冲区:InnoDB 会将事务修改的日志先写入到 日志缓冲区(log buffer)中,再定期将这些日志刷写到 redo log 文件。
- 重做:在系统崩溃时,通过 redo log,MySQL 可以重做(redo)未提交的事务,以确保数据不会丢失(即持久性)。
- 写入顺序:Redo log 是顺序写入的,通常比数据库数据页的更新要快得多。
工作流程
- 事务修改数据时,InnoDB 会首先将修改的日志写入 redo log buffer。
- 每隔一定时间(或者当 buffer 满时),Redo log 会刷新到磁盘的 redo log 文件(通常是
ib_logfile0
和ib_logfile1
)。 - 在崩溃恢复时,MySQL 使用 redo log 中的记录来重做所有未完全持久化的数据修改,确保数据一致性。
例子
- 你执行
UPDATE employees SET salary = 5000 WHERE id = 1;
,修改了数据库中的某个数据页。 - 这个修改操作会先被记录到 redo log 中,而不会立即更新磁盘上的数据页(InnoDB 会将其缓存在内存中)。
- 如果系统崩溃,在恢复时,InnoDB 会通过 redo log 重做未完成的操作。
binlog
Binlog(二进制日志)是 MySQL 用来记录所有对数据库执行的修改操作的日志,主要用于数据的备份、恢复和主从复制。Binlog 记录的是 逻辑层面的操作(SQL 语句或者事件),而不是直接的物理数据修改。
特点
- 逻辑日志:Binlog 记录的是 SQL 语句(如
INSERT
、UPDATE
、DELETE
)或者逻辑事件(如表结构变更)执行的结果,而不是物理的页面修改。 - 主从复制:Binlog 是 MySQL 主从复制的核心,主服务器的所有修改操作(如
INSERT
、UPDATE
等)会被记录在 binlog 中,然后从服务器会从 binlog 中读取这些事件并执行相应的 SQL 语句来保持数据同步。 - 持久性和一致性:Binlog 是一个逻辑日志,用来记录数据变更的操作。它也可以用于数据恢复和备份。
- 不同的格式:Binlog 支持三种格式:
- STATEMENT:记录 SQL 语句。
- ROW:记录每一行数据的具体变化。
- MIXED:混合模式,结合了 STATEMENT 和 ROW 两种模式。
工作流程
- 在执行一个更新操作时(例如
UPDATE employees SET salary = 5000 WHERE department = 'Sales';
),该 SQL 语句会被记录到 binlog 中。 - Binlog 事件会被顺序写入磁盘中的二进制文件,通常是
mysql-bin.000001
这种格式。 - 在主从复制中,从服务器会读取 binlog 中的事件,并通过执行这些事件来同步数据。
例子
- 你执行
INSERT INTO employees (id, name, salary) VALUES (1, 'Alice', 5000);
,该语句会被记录到 binlog 中。 - 主服务器上的所有修改都会写入 binlog,从服务器会读取并执行这些语句,保持与主服务器的数据一致性。
区别
特性 | Redo Log | Binlog |
---|---|---|
目的 | 用于事务持久化和崩溃恢复 | 用于数据备份、恢复和主从复制 |
记录内容 | 物理修改操作(数据页变化) | 逻辑操作(SQL 语句或者事件) |
存储位置 | 存储在 InnoDB 存储引擎的 redo log 文件中 | 存储在 MySQL 的 binlog 文件中 |
更新频率 | 持续且高频的写入,写入日志缓冲区 | 以事件为单位记录,通常是较低频率的写入 |
恢复方式 | 在崩溃恢复时,重做未提交的事务,保证数据一致性 | 可以用于主从复制,也可用于基于事件的恢复 |
是否跨服务器复制 | 不参与主从复制,只与本地数据库相关 | 是的,支持主从复制和基于 binlog 的数据恢复 |
总结
- Redo Log:是 InnoDB 用来确保事务持久性和恢复操作的一种机制,记录了对数据页的物理修改。它用于系统崩溃后的恢复。
- Binlog:记录了数据库的逻辑变化(SQL 语句或事件),用于数据的备份、恢复以及主从复制。
两者各自担任不同的角色,Redo Log 主要用于事务的持久性和崩溃恢复,而 Binlog 则用于数据复制、备份和恢复。
总结
- 解析:解析 SQL 语句。
- 优化:选择最佳执行计划。
- 查找记录:根据
WHERE
条件查找符合更新条件的记录。 - 锁定行:锁定符合条件的记录,防止其他事务并发修改。
- 更新数据:执行实际的更新操作,修改数据页,并记录日志。
- 事务处理:事务提交或回滚(如果是事务型存储引擎)。
影响性能的因素
- 索引:
WHERE
子句中的字段是否有索引。 - 表的大小:表中数据量越大,更新操作的成本越高,特别是没有合适索引时需要全表扫描。
- 事务隔离级别:事务的隔离级别(如
READ COMMITTED
、SERIALIZABLE
)也会影响锁的粒度及更新的性能。 - 表的存储引擎:不同的存储引擎(InnoDB vs MyISAM)会影响更新的行为,尤其是在事务和锁的处理上。
相关文章:
MySQL高级(二):一条更新语句是如何执行的
执行步骤 1. 解析 SQL 语句 MySQL 首先会解析你输入的 UPDATE 语句。解析器会检查语法是否正确,并将 SQL 语句转化为内部的数据结构(通常是语法树)。 示例 SQL 语句: UPDATE employees SET salary 5000 WHERE department Sa…...
在 Ubuntu 18.04 中搭建和测试 DNS 服务器
在 Ubuntu 18.04 中搭建和测试 DNS 服务器可以通过安装和配置 BIND(Berkeley Internet Name Domain)来实现。以下是详细的步骤: 1. 安装 BIND 打开终端并运行以下命令来安装 BIND: sudo apt update sudo apt install bind9 bin…...

算法学习第一弹——C++基础
早上好啊,大佬们。来看看咱们这回学点啥,在前不久刚出完C语言写的PTA中L1的题目,想必大家都不过瘾,感觉那些题都不过如此,所以,为了我们能更好的去处理更难的题目,小白兔决定奋发图强࿰…...

javaWeb小白项目--学生宿舍管理系统
目录 一、检查并关闭占用端口的进程 二、修改 Tomcat 的端口配置 三、重新启动 Tomcat 一、javaw.exe的作用 二、结束javaw.exe任务的影响 三、如何判断是否可以结束 结尾: 这个错误提示表明在本地启动 Tomcat v9.0 服务器时遇到了问题,原因是所需…...

如何优化Elasticsearch的查询性能?
优化Elasticsearch查询性能可以从以下几个方面进行: 合理设计索引和分片: 确保设置合理的分片和副本数,考虑数据量、节点数和集群大小。根据数据量和节点数量调整分片数量,避免使用过多分片,因为每个分片都需要额外的…...
蓝桥杯每日真题 - 第12天
题目:(数三角) 题目描述(14届 C&C B组E题) 解题思路: 给定 n 个点的坐标,计算其中可以组成 等腰三角形 的三点组合数量。 核心条件:等腰三角形的定义是三角形的三条边中至少有…...
从H264视频中获取宽、高、帧率、比特率等属性信息
背景 最近整理视频编解码的代码,早前在jetson上封装了jetson multimedia作为视频编解码的类,供其他同事和其他组使用,但该解码接口有一个问题,无法首先获取视频宽高信息,更无法直接获取视频的帧率、比特率等信息。 解…...

Cyberchef配合Wireshark提取并解析TCP/FTP流量数据包中的文件
前一篇文章中讲述了如何使用cyberchef提取HTTP/TLS数据包中的文件,详见《Cyberchef配合Wireshark提取并解析HTTP/TLS流量数据包中的文件》,链接这里,本文讲述下如何使用cyberchef提取FTP/TCP数据包中的文件。 FTP 是最为常见的文件传输协议,和HTTP协议不同的是FTP协议传输…...

Nginx中使用keepalive实现保持上游长连接实现提高吞吐量示例与测试
场景 HTTP1 .1之后协议支持持久连接,也就是长连接,优点在于在一个TCP连接上可以传送多个HTTP请求和响应, 减少了建立和关闭连接的消耗和延迟。 如果我们使用了nginx去作为反向代理或者负载均衡,从客户端过来的长连接请求就会被…...

深度学习-卷积神经网络CNN
案例-图像分类 网络结构: 卷积BN激活池化 数据集介绍 CIFAR-10数据集5万张训练图像、1万张测试图像、10个类别、每个类别有6k个图像,图像大小32323。下图列举了10个类,每一类随机展示了10张图片: 特征图计算 在卷积层和池化层结束后, 将特征…...
241114.学习日志——[CSDIY] [Cpp]零基础速成 [03]
CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!࿰…...

大模型研究报告 | 2024年中国金融大模型产业发展洞察报告|附34页PDF文件下载
随着生成算法、预训练模型、多模态数据分析等AI技术的聚集融合,AIGC技术的实践效用迎来了行业级大爆发。通用大模型技术的成熟推动了新一轮行业生产力变革,在投入提升与政策扶植的双重作用下,以大模型技术为底座、结合专业化金融能力的金融大…...

数据库SQL——什么是实体-联系模型(E-R模型)?
目录 什么是实体-联系模型? 1.实体集 2.联系集 3.映射基数 一对一(1:1) 一对多(1:n) 多对一(n:1) 多对多(m:n) 全部参与: 4.主码 弱实体集…...
在 MySQL 8.0 中,SSL 解密失败,在使用 SSL 加密连接时出现了问题
在 MySQL 8.0 中,SSL 解密失败通常指的是在使用 SSL 加密连接时出现了问题,导致无法建立加密通信。这个问题可能由多种原因引起,下面是一些常见的原因和排查方法: 1. 证书配置问题 确保您在 MySQL 配置中使用了正确的 SSL 证书和…...
React Native 全栈开发实战班 - 第四部分:用户界面进阶之动画效果实现
在移动应用中,动画效果 是提升用户体验的重要手段。合理的动画设计可以增强应用的交互性、流畅性和视觉吸引力。React Native 提供了多种实现动画的方式,包括内置的 Animated API、LayoutAnimation 以及第三方库(如 react-native-reanimated&…...
【CICD】GitLab Runner 和执行器(Executor
GitLab Runner 和执行器(Executor)是 GitLab CI/CD 管道中的两个重要组成部分。理解它们之间的关系有助于更好地配置和使用 CI/CD 流水线。runer是gitlab的ci-agent对接gitlab,而执行器是接受runer下发的ci的任务来干活的。也就是说gitrunner…...

实用教程:如何无损修改MP4视频时长
如何在UltraEdit中搜索MP4文件中的“mvhd”关键字 引言 在视频编辑和分析领域,有时我们需要深入到视频文件的底层结构中去。UltraEdit(UE)和UEStudio作为强大的文本编辑器,允许我们以十六进制模式打开和搜索MP4文件。本文将指导…...
mysqldump命令搭配source命令完成数据库迁移备份
mysqldump 命令使用 需保证mysqld在运行中, 这个命令的目的是将数据库导出到文件中,例如 mysqldump -uusername -ppassword database > db.sql 注意该命令不是在MySQL客户端(即MySQL命令行)执行的,而是在系统命…...

生信:TCGA学习(R、RStudio安装与下载、常用语法与常用快捷键)
前置环境 macOS系统,已安装homebrew且会相关命令。 近期在整理草稿区,所以放出该贴。 R语言、RStudio、R包安装 R语言安装 brew install rRStudio安装 官网地址:https://posit.co/download/rstudio-desktop/ R包下载 注意R语言环境自带…...

十三、注解配置SpringMVC
文章目录 1. 创建初始化类,代替web.xml2. 创建SpringConfig配置类,代替spring的配置文件3. 创建WebConfig配置类,代替SpringMVC的配置文件4. 测试功能 1. 创建初始化类,代替web.xml 2. 创建SpringConfig配置类,代替spr…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...