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 logbinlog),以便后续的事务恢复或复制。

6. 提交或回滚事务

如果更新操作是在事务中进行的:

  • 如果事务提交,更新会被永久保存。
  • 如果事务回滚,所有更新会被撤销。

在 InnoDB 存储引擎中,更新操作是通过“日志”的方式确保可恢复性的,即使系统崩溃也可以恢复到一致的状态。

7. 提交更新(对于非事务型存储引擎)

对于非事务型存储引擎(如 MyISAM),MySQL 会立即将更新写入磁盘,不需要提交事务。

redo logbinlog

在 MySQL 中,redo logbinlog 都是用于事务日志记录的重要机制。

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 是顺序写入的,通常比数据库数据页的更新要快得多。

工作流程

  1. 事务修改数据时,InnoDB 会首先将修改的日志写入 redo log buffer
  2. 每隔一定时间(或者当 buffer 满时),Redo log 会刷新到磁盘的 redo log 文件(通常是 ib_logfile0ib_logfile1)。
  3. 在崩溃恢复时,MySQL 使用 redo log 中的记录来重做所有未完全持久化的数据修改,确保数据一致性。

例子

  • 你执行 UPDATE employees SET salary = 5000 WHERE id = 1;,修改了数据库中的某个数据页。
  • 这个修改操作会先被记录到 redo log 中,而不会立即更新磁盘上的数据页(InnoDB 会将其缓存在内存中)。
  • 如果系统崩溃,在恢复时,InnoDB 会通过 redo log 重做未完成的操作。

binlog

Binlog(二进制日志)是 MySQL 用来记录所有对数据库执行的修改操作的日志,主要用于数据的备份、恢复和主从复制。Binlog 记录的是 逻辑层面的操作(SQL 语句或者事件),而不是直接的物理数据修改。

特点

  • 逻辑日志:Binlog 记录的是 SQL 语句(如 INSERTUPDATEDELETE)或者逻辑事件(如表结构变更)执行的结果,而不是物理的页面修改。
  • 主从复制:Binlog 是 MySQL 主从复制的核心,主服务器的所有修改操作(如 INSERTUPDATE 等)会被记录在 binlog 中,然后从服务器会从 binlog 中读取这些事件并执行相应的 SQL 语句来保持数据同步。
  • 持久性和一致性:Binlog 是一个逻辑日志,用来记录数据变更的操作。它也可以用于数据恢复和备份。
  • 不同的格式:Binlog 支持三种格式:
    • STATEMENT:记录 SQL 语句。
    • ROW:记录每一行数据的具体变化。
    • MIXED:混合模式,结合了 STATEMENT 和 ROW 两种模式。

工作流程

  1. 在执行一个更新操作时(例如 UPDATE employees SET salary = 5000 WHERE department = 'Sales';),该 SQL 语句会被记录到 binlog 中。
  2. Binlog 事件会被顺序写入磁盘中的二进制文件,通常是 mysql-bin.000001 这种格式。
  3. 在主从复制中,从服务器会读取 binlog 中的事件,并通过执行这些事件来同步数据。

例子

  • 你执行 INSERT INTO employees (id, name, salary) VALUES (1, 'Alice', 5000);,该语句会被记录到 binlog 中。
  • 主服务器上的所有修改都会写入 binlog,从服务器会读取并执行这些语句,保持与主服务器的数据一致性。

区别

特性Redo LogBinlog
目的用于事务持久化和崩溃恢复用于数据备份、恢复和主从复制
记录内容物理修改操作(数据页变化)逻辑操作(SQL 语句或者事件)
存储位置存储在 InnoDB 存储引擎的 redo log 文件中存储在 MySQL 的 binlog 文件中
更新频率持续且高频的写入,写入日志缓冲区以事件为单位记录,通常是较低频率的写入
恢复方式在崩溃恢复时,重做未提交的事务,保证数据一致性可以用于主从复制,也可用于基于事件的恢复
是否跨服务器复制不参与主从复制,只与本地数据库相关是的,支持主从复制和基于 binlog 的数据恢复

总结

  • Redo Log:是 InnoDB 用来确保事务持久性和恢复操作的一种机制,记录了对数据页的物理修改。它用于系统崩溃后的恢复。
  • Binlog:记录了数据库的逻辑变化(SQL 语句或事件),用于数据的备份、恢复以及主从复制。

两者各自担任不同的角色,Redo Log 主要用于事务的持久性崩溃恢复,而 Binlog 则用于数据复制备份恢复

总结

  1. 解析:解析 SQL 语句。
  2. 优化:选择最佳执行计划。
  3. 查找记录:根据 WHERE 条件查找符合更新条件的记录。
  4. 锁定行:锁定符合条件的记录,防止其他事务并发修改。
  5. 更新数据:执行实际的更新操作,修改数据页,并记录日志。
  6. 事务处理:事务提交或回滚(如果是事务型存储引擎)。

影响性能的因素

  • 索引WHERE 子句中的字段是否有索引。
  • 表的大小:表中数据量越大,更新操作的成本越高,特别是没有合适索引时需要全表扫描。
  • 事务隔离级别:事务的隔离级别(如 READ COMMITTEDSERIALIZABLE)也会影响锁的粒度及更新的性能。
  • 表的存储引擎:不同的存储引擎(InnoDB vs MyISAM)会影响更新的行为,尤其是在事务和锁的处理上。

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

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

相关文章

Simulink中Matlab function使用全局变量

目录 一. 引言二. 普通Matlab function使用全局变量三. Simulink中的Matlab function使用全局变量四. 如何利用Matlab function的全局变量施加随机噪声 一. 引言 最近发现了之前仿真中的一个问题,记录一下备忘。 Matlab function中有时候需要用到全局变量&#xf…

react-markdown内容宽度溢出和换行不生效问题

情景复现: 解决办法,添加样式进行限制 /* index.css */ .markdown-container {word-break: break-word; /* 强制长单词断行 */white-space: pre-wrap; /* 保留空白符序列,但是正常地进行换行 */overflow-wrap: break-word; /* 在长单词或…

【C#设计模式(10)——装饰器模式(Decorator Pattern)】

前言 装饰器模式可以在运行时为对象添加额外的功,而无需修改原始对象的代码。这种方式比继承更加灵活。 代码 //蛋糕类(抽象类) public abstract class Cake {public abstract void Create(); } //奶油蛋糕类 public class CreamCake : Cak…

Diffusion Transformer模型结构解析(DiT、SD3、Flux)

Diffusion Transformer模型结构解析(DiT、SD3、Flux) 本文将通过 DiT、SD3、Flux 三个 DiT 相关工作,介绍 Diffusion 中的 Transformer 结构的应用与演进。注意 SD3 和 Flux 采用的 Flow Matching 的扩散模型形式化当然是很关键的改进&#…

给阿里云OSS绑定域名并启用SSL

为什么要这么做? 问题描述: 当用户通过 OSS 域名访问文件时,OSS 会在响应头中增加 Content-Disposition: attachment 和 x-oss-force-download: true,导致文件被强制下载而不是预览。这个问题特别影响在 2022/10/09 之后新开通 OS…

如何找到系统中bert-base-uncased默认安装位置

问题: 服务器中无法连接huggingface,故需要自己将模型文件上传 ubuntu 可以按照这个链接下载 Bert下载和使用(以bert-base-uncased为例) - 会自愈的哈士奇 - 博客园 里面提供了giehub里面的链接 GitHub - google-research/be…

【算法】区间DP

基本内容 [!NOte] 通过分治的思想实现DP数组 入门例子 NOI1995] 石子合并 - 洛谷 | 计算机科学教育新生态 题目要求:给定一圈石头数组,每个石头对应一个权重值,当两个石头合并时组成一个小石头堆,成本为两个石头权重值相加&#x…

机器学习—决定下一步做什么

现在已经看到了很多不同的学习算法,包括线性回归、逻辑回归甚至深度学习或神经网络。 关于如何构建机器学习系统的一些建议 假设你已经实现了正则化线性回归来预测房价,所以你有通常的学习算法的成本函数平方误差加上这个正则化项,但是如果…

第二十周机器学习笔记:初步认识PINN

第二十周周报 摘要Abstract一、初步认识物理信息神经网络(PINN)1.PINN的基本概念2. PINN与传统机器学习的区别3.构建PINN的步骤 二、代码实战——比较RNN、LSTM、Transformer在股市预测的表现1.RNN在股市预测中的表现2.LSTM在股市预测中的表现3.Transfor…

数据结构的时间复杂度和空间复杂度

目录 时间复杂度 空间复杂度 时间复杂度 基本操作的执行次数,为时间复杂度。 我们使用大O的渐进表示法来表示时间复杂度。 怎么使用? 先看例子: 在这个例子中, 基本操作为变量 count 的 加加 操作,并且,执行…

SQL面试题——奔驰SQL面试题 车辆在不同驾驶模式下的时间

SQL面试题——奔驰SQL面试题 我们的表大致如下 CREATE TABLE signal_log( vin STRING COMMENTvehicle frame id, signal_name STRING COMMENTfunction name, signal_value STRING COMMENT signal value , ts BIGINT COMMENTevent timestamp, dt STRING COMMENTformat yyyy-mm…

Mac 使用mac 原生工具将mp4视频文件提取其中的 mp3 音频文件

简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:扎实基础 + 多做笔…

多模态与大模型技术赋能企业数据资产平台建设

文章目录 一、政策背景分析二、企业数据资产运营平台架构思路三、统一多模技术赋能企业数据底座建设四、大模型助力数据资产管理降本增效五、典型案例分享 一、政策背景分析 2023年10月,国家数据局正式挂牌,负责协调推进数据基础制度建设,并…

【CentOS】中的Firewalld:全面介绍与实战应用(上)

🐇明明跟你说过:个人主页 🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、iptables 时代 2、firewalld 时代 3、 从 ipt…

使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行(一)

import binascii import unicorn import capstonedef printArm32Regs(mu):for i in range(66,78):print("R%d,value:%x"%(i-66,mu.reg_read(i)))def testhumb():CODE b\x1C\x00\x0A\x46\x1E\x00"""MOV R3, R0 的机器码:0x1C 0x00&#xf…

NVT新能德科技入职测评SHL题库更新:数字推理+演绎推理高分答案、真题解析

新能德的入职Verify测评主要考察应聘者的逻辑推理能力、数学能力、数据分析能力以及处理信息的能力。根据搜索结果,测评通常包含以下几个部分: 1. **语言理解**:这部分包括阅读理解、逻辑填空和语句排序。要求应聘者在17分钟内完成30题&#…

HBase理论_背景特点及数据单元及与Hive对比

本文结合了个人的笔记以及工作中实践经验以及参考HBase官网,我尽可能把自己的知识点呈现出来,如果有误,还请指正。 1. HBase背景 HBase作为面向列的数据库运行在HDFS之上,HDFS缺乏随机读写操作,HBase正是为此而出现。…

Linux:进程概念

文章目录 前言一、冯诺依曼体系二、操作系统(Operator System)2.1.操作系统的概念2.2 系统调⽤和库函数概念 三. 进程3.1 基本概念3.1.1 描述进程3.1.2 task_struct 3.2 查看进程3.2.1 getpid3.2.2 proc3.2.3 getppid 总结 前言 • 课本概念:程序的⼀个执⾏实例&am…

el-form el-table 前端排序+校验+行编辑

一、页面 <template><div class"bg" v-if"formData.mouldData?.length 0">当前暂无模板&#xff0c;点击<view class"add" click"addMould">立即创建</view></div><div v-else><el-col :x…

jmeter常用配置元件介绍总结之后置处理器

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之后置处理器 8.后置处理器8.1.CSS/JQuery提取器8.2.JSON JMESPath Extractor8.3.JSON提取器8.4.正则表达式提取器8.5.边界提取器8.5.Debug PostProcessor8.6.XPath2 Extractor8.7.XPath提取器8.8.结果状态处理器 8.后置处理…