mysql update语句的执行流程

update tb_student A set A.age='19' where A.name=' 张三 ';

这条 SQL 语句,MySQL 的执行流程可以分为如下几个步骤:

  1. 客户端/服务器通信
  2. 查询解析和预处理
  3. 查询优化器生成执行计划
  4. 开始事务(如果使用事务)
  5. 查询执行
  6. 记录 binlog(事务提交前写入 binlog
  7. 两阶段提交(确保 binlogredo log 一致)
  8. 事务提交
  9. 返回结果

流程说明:

  1. 客户端/服务器通信

    用户在客户端发出 UPDATE tb_student SET age='19' WHERE name='张三'; 语句。

  2. 查询解析和预处理

    MySQL 解析 SQL 语句,并检查表和列是否存在,用户权限是否足够,SQL 语法是否正确。

  3. 查询优化器生成执行计划

    MySQL 优化器生成执行计划,决定如何最快地找到 name='张三' 并更新 age 字段。

  4. 开始事务(如果使用事务)

    当事务开始时,InnoDB 存储引擎会记录 undo log,以备事务回滚使用。这时候数据在内存中更新,但尚未对外生效。

  5. 查询执行

    根据执行计划,MySQL 从表中找到 name='张三' 的记录,并将 age 更新为 19。此时,更新只是在内存中进行,并且修改的旧数据会被写入 undo log

  6. 记录 binlog(在事务提交前)

    这是 binlog 记录的关键步骤。在事务准备提交时,MySQL 会按照以下步骤处理:

    • 生成 binlog 条目 :对于 UPDATE 语句,MySQL 会生成该语句的 binlog 记录。如果使用 row-based 方式记录 binlog,则会记录受影响行的旧值和新值。如果是 statement-based 方式,MySQL 则会记录 SQL 语句本身。
    • 写入 binlog :MySQL 将生成的 binlog 条目写入到二进制日志文件中,但此时事务尚未正式提交,处于准备提交状态。
  7. 两阶段提交

    MySQL 使用两阶段提交来确保 binlog 和存储引擎的 redo log 保持一致,以避免在崩溃恢复时出现数据不一致的问题。两阶段提交过程如下:

    • 第一阶段:写入 binlog :首先,MySQL 会将生成的 binlog 记录持久化到磁盘中。
    • 第二阶段:写入 redo log 并提交事务 :接着,MySQL 将 redo log 写入存储引擎,并提交事务。在 redo logbinlog 都成功写入磁盘后,事务才被认为正式提交。
  8. 事务提交

    MySQL 在完成两阶段提交后,事务会正式提交。事务提交后,内存中的数据修改生效,InnoDB 也会更新数据页,并在适当时候将修改后的数据页写回到磁盘。

  9. 返回结果

    最终,MySQL 向客户端返回成功信息,表示更新操作已成功完成,并且 binlog 中记录了该更新。

binlog 的作用:

  1. 数据恢复 :在崩溃恢复时,binlog 记录的 SQL 操作可以帮助将系统恢复到崩溃前的状态。
  2. 主从复制 :在主从复制场景中,binlog 被用于将主库上的数据修改同步到从库上。
相关推荐
ClouGence1 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
先吃饱再说18 小时前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
Nturmoils18 小时前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
Databend21 小时前
Agent 轨迹分析与归因的数据工程实践
大数据·数据库·agent
这个DBA有点耶21 小时前
SQL改写进阶:标量子查询的“隐形代价”与消除实战
数据库·mysql·架构
smallyoung1 天前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·mysql·postgresql
parade岁月1 天前
MySQL JOIN解析:朴实无华但食之有味
数据库·后端
用户3169353811831 天前
MySQL服务无法启动问题解决全记录
数据库
vivo互联网技术1 天前
从 10 分钟到 1 秒:ES 深度分页任意跳页的三轮优化实战
服务器·数据库·redis·elasticsearch·深度分页
数据技术说1 天前
MySQL 迁移实战——如何实现真正的"零改造"平滑切换
mysql