尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

1202_InnoDB中一条UPDATE语句的执行流程

1202_InnoDB中一条UPDATE语句的执行流程
📅 发布时间:2026/6/20 23:24:11

InnoDB中一条UPDATE语句的执行流程可以概括为以下步骤和图示:
image
image

下面是每个步骤的详细说明:

第一步:连接器与权限验证 (Client → Server Layer)

  1. 建立连接:客户端应用程序(如Java程序、MySQL CLI)与MySQL服务器建立连接。
  2. 权限验证:连接器验证该用户是否有执行 UPDATE 语句及操作目标表的权限。

第二步:分析与优化 (Server Layer)

  1. 分析器:对SQL语句进行词法分析(识别 UPDATE、表名、列名等)和语法分析(判断语句是否符合MySQL语法规则)。
  2. 优化器:确定最优的执行计划。
    • 根据表的索引、统计信息等,决定是使用主键索引、二级索引还是全表扫描来定位要更新的数据行。
    • 生成一个执行计划。

第三步:执行器调用引擎接口 (Server Layer → Storage Engine Layer)

  1. 执行器:根据优化器生成的执行计划,调用 InnoDB 存储引擎提供的接口,开始执行真正的数据更新。

第四步:InnoDB 引擎内部流程 (Storage Engine Layer)

这是最核心和最复杂的一部分。

  1. Buffer Pool (缓冲池)

    • 检查数据页:执行器要更新的记录所在的数据页是否已经在内存的 Buffer Pool 中。
    • 如果不在:则从磁盘(.ibd 文件)中读取对应的数据页,加载到 Buffer Pool 中。
    • 修改内存数据:在 Buffer Pool 中直接修改对应的数据记录。此时,内存中的数据页与磁盘中的数据页不再一致,该页称为“脏页”。
  2. Undo Log (回滚日志)

    • 在修改 Buffer Pool 中的数据之前,会先将这条数据的旧版本写入 Undo Log。
    • 作用一:事务回滚:如果事务后续失败回滚,可以用 Undo Log 将数据恢复为原来的值。
    • 作用二:实现 MVCC:其他并发事务可能仍在读取该数据的旧版本,Undo Log 为它们提供了多版本视图,保证了隔离性。
  3. Redo Log Buffer (重做日志缓冲)

    • 在数据修改之后,会将这个物理修改操作记录到 Redo Log Buffer 中。
    • Redo Log 记录的是“在某个数据页上做了什么修改”,属于物理日志。
    • 此时 Redo Log 还在内存中,并未持久化到磁盘。
  4. 事务的提交(两阶段提交 - 2PC)
    当执行 COMMIT 语句时(或者 autocommit=1 时 UPDATE 自动提交),会触发最关键的持久化步骤:

    • Prepare 阶段:将 Redo Log Buffer 中的内容刷盘(fsync) 到 Redo Log File(重做日志文件,通常是 ib_logfile0、ib_logfile1)中,并将日志状态标记为 PREPARE。此时事务已经保证持久性了。
    • Commit 阶段:
      • 写 Binlog:执行器将整个事务的 Binlog(逻辑日志)写入 Binlog Cache,然后刷盘(fsync)到磁盘上的 Binlog 文件。
      • Commit 标记:InnoDB 引擎在收到 Binlog 写入完成的信号后,会将刚才写入的 Redo Log 打上 COMMIT 标记,表示事务提交成功。

    为什么需要两阶段提交?
    为了确保 Redo Log 和 Binlog 的逻辑一致性。如果不一致,在主从复制时会导致主从数据不一致。2PC 像一个“分布式事务”,只有两个日志都准备好才最终提交。

第五步:后续操作

  1. 返回结果:执行器将执行结果返回给客户端,告知影响的行数。
  2. 异步刷盘:
    • 脏页刷盘:Buffer Pool 中的“脏页”会由后台线程(Page Cleaner)通过 Checkpoint 机制在某个时间点异步地刷回到磁盘的数据文件中(.ibd文件)。这个操作不是事务提交的必经之路,大大提升了数据库的写入性能。
    • Undo Log 清理:事务提交后,对应的 Undo Log 不会立即删除,因为它可能还被 MVCC 使用。会在不再被任何事务需要时,由后台线程清理。

总结与关键点

  • 核心内存结构:Buffer Pool,是数据操作的主战场。
  • 关键日志:
    • Undo Log:保证原子性和隔离性(MVCC)。
    • Redo Log:保证持久性,采用 WAL(Write-Ahead Logging) 技术,先写日志再刷数据页,极大提升IO性能。
    • Binlog:用于归档和主从复制,是Server层的日志。
  • 性能关键:将随机写磁盘(写数据页)转换为了顺序写磁盘(写Redo Log),再通过异步刷盘完成数据持久化,这是InnoDB高性能写入的核心秘诀。
  • 数据一致性关键:两阶段提交保证了Redo Log和Binlog的逻辑一致性。

相关新闻

  • 记录---vue3项目实战 打印、导出PDF
  • node.js安装(绿色版)
  • 08

最新新闻

  • S12X XGATE协处理器实现SCI中断驱动与环形缓冲区设计
  • i.MX 6处理器引脚复位状态解析:硬件设计中的关键细节与避坑指南
  • 告别激活烦恼:3分钟让Windows和Office永久保持激活状态
  • MPC8536DS嵌入式系统引导实战:从eSDHC与eSPI启动原理到Linux部署
  • 基于因果干预的大语言模型去毒技术:从PARATOX评估到CAUSALDETOX实践
  • 2026年上海家电维修平台推荐:本地用户反馈靠谱的家电维修服务商-修乐家家电维修 - 资讯速览

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号