0
点赞
收藏
分享

微信扫一扫

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 条目写入到二进制日志文件中,但此时事务尚未正式提交,处于准备提交状态。
  1. 两阶段提交
    MySQL 使用两阶段提交来确保 binlog 和存储引擎的 redo log 保持一致,以避免在崩溃恢复时出现数据不一致的问题。两阶段提交过程如下:
  • 第一阶段:写入 binlog:首先,MySQL 会将生成的 binlog 记录持久化到磁盘中。
  • 第二阶段:写入 redo log 并提交事务:接着,MySQL 将 redo log 写入存储引擎,并提交事务。在 redo logbinlog 都成功写入磁盘后,事务才被认为正式提交。
  1. 事务提交
    MySQL 在完成两阶段提交后,事务会正式提交。事务提交后,内存中的数据修改生效,InnoDB 也会更新数据页,并在适当时候将修改后的数据页写回到磁盘。
  2. 返回结果
    最终,MySQL 向客户端返回成功信息,表示更新操作已成功完成,并且 binlog 中记录了该更新。

binlog 的作用:

  1. 数据恢复:在崩溃恢复时,binlog 记录的 SQL 操作可以帮助将系统恢复到崩溃前的状态。
  2. 主从复制:在主从复制场景中,binlog 被用于将主库上的数据修改同步到从库上。


举报

相关推荐

0 条评论