MySQL UPDATE 执行流程全解析

news2025/5/18 15:18:31

引言

当你在 MySQL 中执行一条 UPDATE 语句时,背后隐藏着一套精密的协作机制。从解析器到存储引擎,从锁管理到 WAL 日志,每个环节都直接影响数据一致性和性能。
本文将通过 Mermaid 流程图 和 时序图,完整还原 UPDATE 语句的执行流程,并深入解析关键环节的优化策略与潜在陷阱。


一、整体执行流程概览

1.1 核心阶段划分

客户端发送UPDATE
语法解析
生成解析树
逻辑优化
生成执行计划
获取锁
执行数据修改
记录Redo Log
返回结果集

1.2 关键组件角色

组件职责
解析器将 SQL 转换为抽象语法树(AST)
优化器选择最优执行计划(基于成本模型)
锁管理器管理行锁、间隙锁,防止并发冲突
InnoDB 存储引擎实际修改数据页,管理 undo log 和 redo log
Binlog记录逻辑日志(用于主从复制)

二、详细执行步骤解析

2.1 语法解析与解析树

示例 SQL:

UPDATE users 
SET age = 30 
WHERE id = 1 
AND create_time > '2023-01-01';

解析树结构(简化版):

Root
UpdateSet
FromClause
WhereClause
age=30
users
id=1 AND create_time>'2023-01-01'

2.2 逻辑优化策略

优化器决策树:

graph TD
    A[是否使用索引?] -->|是| B[选择覆盖索引或回表]
    A -->|否| C[全表扫描]
    B --> D[评估索引选择性]
    C --> E[判断是否需要临时表]

优化器行为示例:
• 索引选择:若 id 是主键,直接定位到行;若 create_time 有索引,可能走范围扫描。

• 连接条件:单表更新无需连接,但子查询可能触发临时表。


三、物理执行流程

3.1 执行计划生成

优化器生成执行计划
访问路径选择
IndexScan
TableScan
回表查询
直接读取数据

3.2 存储引擎交互时序

客户端 Server StorageEngine 发送UPDATE 提交执行计划 返回受影响行数 锁定行,修改数据 写redo log loop [按行处理] 返回结果 客户端 Server StorageEngine

四、关键机制详解

4.1 锁机制与并发控制

行锁类型:
• 共享锁(S 锁):允许其他事务读,但禁止写。

• 排他锁(X 锁):禁止其他事务读写。

死锁场景示例:

事务A 事务B StorageEngine 锁定 id=1 锁定 id=2 请求锁定 id=2 → 等待 请求锁定 id=1 → 等待 → 死锁检测 事务A 事务B StorageEngine

4.2 WAL(Write-Ahead Logging)机制

数据修改流程:
在这里插入图片描述

日志刷盘策略:
• innodb_flush_log_at_trx_commit=1(默认):每次提交刷盘,安全但性能低。

• innodb_flush_log_at_trx_commit=2:每秒刷盘,可能丢失1秒数据。


五、性能优化实战

5.1 索引优化

最左前缀原则应用:

-- 创建联合索引
CREATE INDEX idx_id_create ON users(id, create_time);

-- 有效查询(匹配左前缀)
UPDATE users 
SET age = 30 
WHERE id = 1 
AND create_time > '2023-01-01';

-- 无效查询(跳过id)
UPDATE users 
SET age = 30 
WHERE create_time > '2023-01-01';

5.2 避免全表扫描

优化前:

-- 无索引,全表扫描
UPDATE orders 
SET status = 'paid' 
WHERE user_id = 100;

优化后(添加索引):

ALTER TABLE orders ADD INDEX idx_user_id (user_id);

六、诊断工具使用

6.1 EXPLAIN 分析

EXPLAIN UPDATE users SET age=30 WHERE id=1;
字段含义
type访问类型(const=唯一索引)
key实际使用的索引
rows预估扫描行数
Extra是否使用临时表/文件排序

总结

MySQL 的 UPDATE 执行流程是 解析 → 优化 → 锁管理 → 数据修改 → 日志记录 的精密协作过程。理解以下核心原则可显著提升性能:

  1. 优先使用索引,避免全表扫描。
  2. 控制事务粒度,减少锁竞争。
  3. 合理配置日志策略,平衡性能与数据安全。

通过结合 EXPLAIN 分析和索引优化,开发者可以高效定位性能瓶颈。下一篇我们将深入探讨 InnoDB 的 MVCC 实现原理,敬请期待!

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

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

相关文章

亚马逊云科技:开启数字化转型的无限可能

在数字技术蓬勃发展的今天,云计算早已突破单纯技术工具的范畴,成为驱动企业创新、引领行业变革的核心力量。亚马逊云科技凭借前瞻性的战略布局与持续的技术深耕,在全球云计算领域树立起行业标杆,为企业和个人用户提供全方位、高品…

【实测有效】Edge浏览器打开部分pdf文件显示空白

问题现象 Edge浏览器打开部分pdf文件显示空白或显示异常。 ​​​​​​​ ​​​​​​​ ​​​​​​​ 问题原因 部分pdf文件与edge浏览器存在兼容性问题,打开显示异常。 解决办法 法1:修改edge配置 打开edge浏览器&#x…

RJ连接器的未来:它还会是网络连接的主流标准吗?

RJ连接器作为以太网接口的代表,自20世纪以来在计算机网络、通信设备、安防系统等领域中占据了核心地位。以RJ45为代表的RJ连接器,凭借其结构稳定、信号传输可靠、成本低廉等优势,在有线网络布线领域被广泛采用。然而,在无线网络不…

Redis持久化机制详解:保障数据安全的关键策略

在现代应用开发中,Redis作为高性能的内存数据库被广泛使用。然而,内存的易失性特性使得持久化成为Redis设计中的关键环节。本文将全面剖析Redis的持久化机制,包括RDB、AOF以及混合持久化模式,帮助开发者根据业务需求选择最适合的持…

DeepSeek 大模型部署全指南:常见问题、优化策略与实战解决方案

DeepSeek 作为当前最热门的开源大模型之一,其强大的语义理解和生成能力吸引了大量开发者和企业关注。然而在实际部署过程中,无论是本地运行还是云端服务,用户往往会遇到各种技术挑战。本文将全面剖析 DeepSeek 部署中的常见问题,提…

嵌入式培训之数据结构学习(五)栈与队列

一、栈 (一)栈的基本概念 1、栈的定义: 注:线性表中的栈在堆区(因为是malloc来的);系统中的栈区存储局部变量、函数形参、函数返回值地址。 2、栈顶和栈底: 允许插入和删除的一端…

RabbitMQ--进阶篇

RabbitMQ 客户端整合Spring Boot 添加相关的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 编写配置文件&#xff0c;配置RabbitMQ的服务信息 spri…

Android Studio报错Cannot parse result path string:

前言 最近在写个小Demo&#xff0c;参考郭霖的《第一行代码》&#xff0c;学习DrawerLayout和NavigationView&#xff0c;不知咋地&#xff0c;突然报错Cannot parse result path string:xxxxxxxxxxxxx 反正百度&#xff0c;问ai都找不到答案&#xff0c;报错信息是完全看不懂…

关于网站提交搜索引擎

发布于Eucalyptus-blog 一、前言 将网站提交给搜索引擎是为了让搜索引擎更早地了解、索引和显示您的网站内容。以下是一些提交网站给搜索引擎的理由&#xff1a; 提高可见性&#xff1a;通过将您的网站提交给搜索引擎&#xff0c;可以提高您的网站在搜索结果中出现的机会。当用…

基于QT(C++)OOP 实现(界面)酒店预订与管理系统

酒店预订与管理系统 1 系统功能设计 酒店预订是旅游出行的重要环节&#xff0c;而酒店预订与管理系统中的管理与信息透明是酒店预订业务的关键问题所在&#xff0c;能够方便地查询酒店信息进行付款退款以及用户之间的交流对于酒店预订行业提高服务质量具有重要的意义。 针对…

机械元件杂散光难以把控?OAS 软件案例深度解析

机械元件的杂散光分析 简介 在光学系统设计与工程实践中&#xff0c;机械元件的杂散光问题对系统性能有着不容忽视的影响。杂散光会降低光学系统的信噪比、图像对比度&#xff0c;甚至导致系统功能失效。因此&#xff0c;准确分析机械元件杂散光并采取有效抑制措施&#xff0c…

游戏引擎学习第289天:将视觉表现与实体类型解耦

回顾并为今天的工作设定基调 我们正在继续昨天对代码所做的改动。我们已经完成了“脑代码&#xff08;brain code&#xff09;”的概念&#xff0c;它本质上是一种为实体构建的自组织控制器结构。现在我们要做的是把旧的控制逻辑迁移到这个新的结构中&#xff0c;并进一步测试…

【Linux网络】ARP协议

ARP协议 虽然我们在这里介绍 ARP 协议&#xff0c;但是需要强调&#xff0c;ARP 不是一个单纯的数据链路层的协议&#xff0c;而是一个介于数据链路层和网络层之间的协议。 ARP数据报的格式 字段长度&#xff08;字节&#xff09;说明硬件类型2网络类型&#xff08;如以太网为…

MUSE Pi Pro 开发板 Imagination GPU 利用 OpenCL 测试

视频讲解&#xff1a; MUSE Pi Pro 开发板 Imagination GPU 利用 OpenCL 测试 继续玩MUSE Pi Pro&#xff0c;今天看下比较关注的gpu这块&#xff0c;从opencl看起&#xff0c;安装clinfo指令 sudo apt install clinfo 可以看到这颗GPU是Imagination的 一般嵌入式中gpu都和hos…

多线程与线程互斥

我们初步学习完线程之后&#xff0c;就要来试着写一写多线程了。在写之前&#xff0c;我们需要继续来学习一个线程接口——叫做线程分离。 默认情况下&#xff0c;新创建的线程是joinable的&#xff0c;线程退出后&#xff0c;需要对其进行pthread_join操作&#xff0c;否则无法…

游戏引擎学习第287天:加入brain逻辑

Blackboard&#xff1a;动态控制类似蛇的多节实体 我们目前正在处理一个关于实体系统如何以组合方式进行管理的问题。具体来说&#xff0c;是在游戏中实现多个实体可以共同或独立行动的机制。例如&#xff0c;我们的主角拥有两个实体组成部分&#xff0c;一个是身体&#xff0…

continue通过我们的开源 IDE 扩展和模型、规则、提示、文档和其他构建块中心,创建、共享和使用自定义 AI 代码助手

​一、软件介绍 文末提供程序和源码下载 Continue 使开发人员能够通过我们的开源 VS Code 和 JetBrains 扩展以及模型、规则、提示、文档和其他构建块的中心创建、共享和使用自定义 AI 代码助手。 二、功能 Chat 聊天 Chat makes it easy to ask for help from an LLM without…

2025年EB SCI2区TOP,多策略改进黑翅鸢算法MBKA+空调系统RC参数辨识与负载聚合分析,深度解析+性能实测

目录 1.摘要2.黑翅鸢优化算法BKA原理3.改进策略4.结果展示5.参考文献6.代码获取7.读者交流 1.摘要 随着空调负载在电力系统中所占比例的不断上升&#xff0c;其作为需求响应资源的潜力日益凸显。然而&#xff0c;由于建筑环境和用户行为的变化&#xff0c;空调负载具有异质性和…

.NET 中管理 Web API 文档的两种方式

前言 在 .NET 开发中管理 Web API 文档是确保 API 易用性、可维护性和一致性的关键。今天大姚给大家分享两种在 .NET 中管理 Web API 文档的方式&#xff0c;希望可以帮助到有需要的同学。 Swashbuckle Swashbuckle.AspNetCore 是一个流行的 .NET 库&#xff0c;它使得在 AS…

【HTML】个人博客页面

目录 页面视图​编辑 页面代码 解释&#xff1a; HTML (<body>): 使用了更加语义化的HTML5标签&#xff0c;例如<header>, <main>, <article>, <footer>。文章列表使用了<article>包裹&#xff0c;结构清晰。添加了分页导航。使用了Font…