当前位置: 首页 > news >正文

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 被用于将主库上的数据修改同步到从库上。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PDB数据库中蛋白质结构文件数据格式
  • Python 类class的用法详解
  • 《重生之我在java世界做任务升级》--第一章
  • 免费的跨平台剪贴板工具,超好用!
  • 【计算机网络】计算机网络基础二
  • Java Web服务运行一段时间后出现cpu升高导致的性能下降问题排查
  • C++ std::find函数 容器元素查找
  • PHP智慧教育新篇章优校管理系统小程序源码
  • 适用于QF的存档系统
  • python是什么语言写的
  • Go语言并发模式详解:深入理解管道与上下文的高级用法
  • Android-UI设计
  • 数据结构与算法 #时间复杂度 #空间复杂度
  • 可智能生成刺绣图案!武汉纺织大学可视计算与数字纺织团队发布首个多缝线刺绣生成对抗网络模型,被顶级期刊 TVCG 录用
  • 《重生之我在java世界做任务升级》--第二章
  • 收藏网友的 源程序下载网
  • [Vue CLI 3] 配置解析之 css.extract
  • 《深入 React 技术栈》
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • git 常用命令
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • jquery ajax学习笔记
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • mysql常用命令汇总
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Xmanager 远程桌面 CentOS 7
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 高程读书笔记 第六章 面向对象程序设计
  • 关于Java中分层中遇到的一些问题
  • 前端之React实战:创建跨平台的项目架构
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何在 Tornado 中实现 Middleware
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 在weex里面使用chart图表
  • 怎样选择前端框架
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​TypeScript都不会用,也敢说会前端?
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # Kafka_深入探秘者(2):kafka 生产者
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #pragma data_seg 共享数据区(转)
  • (1)常见O(n^2)排序算法解析
  • (20050108)又读《平凡的世界》
  • (4)(4.6) Triducer
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (Git) gitignore基础使用
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (办公)springboot配置aop处理请求.
  • (六)激光线扫描-三维重建
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)Oracle存储过程编写经验和优化措施