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…...
工业级Linux超长期支持方案:RZ/G平台与CIP SLTS内核实战解析
1. 项目概述:当工业设备遇上超长待机的Linux在工业自动化、能源控制、轨道交通这些领域摸爬滚打过的嵌入式开发者,心里都清楚一个“老大难”问题:软件的生命周期,尤其是操作系统的维护周期,远跟不上硬件的服役年限。一…...
手把手复现:用GCC编译选项关闭栈保护,一步步演示缓冲区溢出攻击(附完整代码)
从零构建缓冲区溢出攻击实验:GCC编译选项与漏洞利用实战指南 缓冲区溢出攻击作为系统安全领域的经典课题,至今仍在各类CTF竞赛和实际渗透测试中频繁出现。对于刚接触底层安全的研究者而言,亲手复现一次完整的溢出攻击过程,远比阅读…...
【YOLOv5 v6.1】从零到一:手把手实战自定义数据集训练与部署避坑指南
1. 环境准备:从零搭建YOLOv5训练环境 第一次接触YOLOv5时,我最头疼的就是环境配置。这里分享一个经过多次验证的稳定方案,适用于大多数NVIDIA显卡设备。首先需要安装Anaconda,这是管理Python环境的利器。我习惯用Miniconda&#x…...
缠论分析工具终极指南:如何在通达信中实现可视化技术分析
缠论分析工具终极指南:如何在通达信中实现可视化技术分析 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 还在为复杂的缠论分析而头疼吗?想要在通达信软件中轻松识别分型、笔、线…...
堆叠集成方法
原文:towardsdatascience.com/the-stacking-ensemble-method-984f5134463a 发现堆叠在机器学习中的力量——一种将多个模型组合成一个单一强大预测器的技术。本文从基础知识到高级技术探讨了堆叠,揭示了它是如何结合不同模型的优势以提高准确性的。无论你…...
python海龟绘图之点击屏幕事件处理
在《python海龟绘图之鼠标事件处理》中提到,onclick()函数能够对鼠标点击事件进行处理。但是该鼠标点击事件指的是鼠标点击到海龟图标上的事件,而如果要处理鼠标点击到海龟绘图窗口的任意位置事件的处理,则要用到onscreenclick()函数。通过on…...
Perplexity搜索效率提升73%的6个隐藏技巧:资深AI分析师亲测有效
更多请点击: https://intelliparadigm.com 第一章:Perplexity搜索效率提升73%的底层动因解析 Perplexity 作为新一代语义优先的AI搜索引擎,其搜索延迟中位数从 1.84s 降至 0.50s(实测提升 73%),这一突破并…...
在微服务架构中利用 Taotoken 实现多模型 API 的动态切换与调用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在微服务架构中利用 Taotoken 实现多模型 API 的动态切换与调用 面向后端架构师或开发负责人,当微服务系统需要集成多种…...
tinySPL 与 U-Boot 核心区别
tinySPL 与 U-Boot 核心区别 一、定位本质项目tinySPLU-Boot定位轻量极简二级引导,专为RTOS/裸机设计通用全能大型Bootloader,主打Linux系统体积极小,几十KB级别大,几百KB~数MB设计目标极速启动、轻量化、适配嵌入式轻系统功能最全…...
你的TP53基因在哪个数据库?一文搞懂Ensembl ID、Entrez ID、UniProt ID在生信分析中的实战选择
你的TP53基因在哪个数据库?一文搞懂Ensembl ID、Entrez ID、UniProt ID在生信分析中的实战选择 在基因组学研究中,一个基因就像一位国际旅行者,每到一个国家(数据库)就会获得一个新的护照号码(基因ID&#…...
