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

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

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_logfile0ib_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的逻辑一致性。
http://www.sczhlp.com/news/116398/

相关文章:

  • 1201_mysql查询语句select执行流程
  • 记录---vue3项目实战 打印、导出PDF
  • 简述网站开发的几个阶段做兼职的网站都有哪些
  • app与移动网站开发考试资料杭州富阳建设局网站首页
  • 网站风格设计要素做网站获取手机号码
  • 泰安定制网站建设公司专业做视频的网站有哪些
  • 09
  • node.js安装(绿色版)
  • 08
  • selenium完整版一览 - 教程
  • 创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—开发环境搭建(二) - 创龙科技
  • 网站建设 启象科技做一个关于电影的网页设计
  • php和什么语言做网站做推广最好的网站是哪个?
  • 固戍网站建设wordpress 哪个版本
  • wordpress 下载站模板前端入门先学什么
  • psd模板怎么做网站wordpress coming soon
  • 网站建设统计表北海做网站有哪家好
  • 百度网站地址提交南通网站建设公司哪家好
  • 网站绑定ftpwordpress更新内容
  • 网站备案 icp备案微信公众帐号开发
  • 如何用凡科做网站青岛官网优化
  • 北京建网站公司有哪些网站开发月薪
  • ctfshow web55
  • ctfshow web58
  • ctfshow web57
  • 01
  • 西安网站制作推广代做网站公司有哪些
  • 门户网站改版建议ui设计优秀案例
  • xp asp 网站建设重庆建设工程信息网下载
  • 产品建站工具国内谷歌网站SEO优化