当前位置: 首页 > 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.hskmm.com/?act=detail&tid=9773

相关文章:

  • 1201_mysql查询语句select执行流程
  • 记录---vue3项目实战 打印、导出PDF
  • 09
  • node.js安装(绿色版)
  • 08
  • selenium完整版一览 - 教程
  • 创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—开发环境搭建(二) - 创龙科技
  • ctfshow web55
  • ctfshow web58
  • ctfshow web57
  • 01
  • test 1
  • 关于如何计算空间
  • ECT-OS-JiuHuaShan框架实现的元推理,是新质生产力的绝对标杆
  • 线性调频信号(LFM)在雷达中的时域及频域MATLAB编程
  • Ubuntu 18.04 LTS 安装 6.10.10 内核 - 教程
  • 国标GB28181视频平台EasyGBS核心功能解密:如何实现海量设备的录像精准检索与高效回放?
  • 最大流判定+拆点
  • C++ 左值、右值、左值引用、右值引用
  • 基数排序模板(Radix Sort)
  • [项目开发经验分享]基于强类型事件的类型参数传递问题 —— 在 .NET Winform项目中如何设计泛型事件总线以实现UI与核心层的解耦
  • python3安装pip3
  • 堆基础知识
  • RUST 实现 Future trait
  • 行程长度编码
  • mysql 虚拟列,可以简化 SQL 逻辑、提升查询效率
  • Flash Attention算法动画
  • PointNetwork-求解TSP-05 - jack
  • 多站点的TSP问题求解-06 - jack
  • Windows 11如何进入安全模式