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 被用于将主库上的数据修改同步到从库上。
相关推荐
csdn2015_1 分钟前
postgresql 拼接字段
数据库
\xin7 分钟前
pikachu自编SQL(POST)
java·数据库·sql
oldking呐呐11 分钟前
MySQL从建库到删库跑路 -- 4.表的操作
后端·mysql
2301_8159019717 分钟前
SQL如何将多行记录聚合成逗号分隔字符串_GROUP_CONCAT技巧
jvm·数据库·python
秋923 分钟前
Kingbase下载、安装和使用详解
数据库
zjy277771 小时前
Layui tab选项卡如何动态根据ID值进行程序化切换
jvm·数据库·python
m0_602857761 小时前
Redis如何修复槽位分配重叠的脏状态_使用redis-cli --cluster fix工具扫描并修复不一致的Slot
jvm·数据库·python
hljqfl1 小时前
Oracle存储结构
数据库·oracle
2301_766283441 小时前
怎样开启phpMyAdmin的操作审计日志_记录每条执行的SQL
jvm·数据库·python
y = xⁿ1 小时前
Redis八股学习日记:布隆过滤器
数据库·redis·学习