%% MySQL Architecture & SQL Execution Flow flowchart TD %% ========== 主流程 ========== A[应用程序/Client] --> B["连接器(Connection Pool) 管理连接 权限验证"] B --> C["分析器(Parser) 词法/语法分析 生成语法树"] C --> D["优化器(Optimizer) 生成执行计划 索引选择/成本计算"] D --> E["执行器(Executor)"] %% ========== 读操作 ========== subgraph 读流程 E --> F1["调用存储引擎read接口"] F1 --> G1{"缓冲池(Buffer Pool) 数据页是否存在?"} G1 -->|是| H1[返回数据] G1 -->|否| I1["从磁盘加载数据页到缓冲池"] I1 --> G1 end %% ========== 写操作 ========== subgraph 写流程["写操作 (UPDATE)"] E --> F2["调用存储引擎fetch接口"] F2 --> G2["缓冲池(Buffer Pool)"] G2 --> H2["记录Undo Log (用于回滚/MVCC)"] G2 --> I2["修改数据页 (变为脏页)"] I2 --> J2["记录Redo Log到Log Buffer (Prepare状态)"] J2 --> K2["Redo Log刷盘 (WAL原则)"] K2 --> L2["写Binlog"] L2 --> M2["Redo Log标记Commit (两阶段提交)"] M2 --> N2["返回成功"] N2 --> O2["后台异步刷脏页 (Checkpoint)"] end %% ========== 存储引擎层 ========== subgraph 存储引擎层["InnoDB存储引擎层"] G1 & G2 --> P["缓冲池(Buffer Pool) LRU淘汰策略 | 脏页管理"] H2 --> Q["回滚日志(Undo Log) MVCC版本链 | 事务回滚"] J2 --> R["重做日志(Redo Log) ib_logfile0/1 | 循环写入 Crash Recovery"] P --> S["变更缓冲(Change Buffer) 优化非唯一二级索引DML"] P --> T["自适应哈希索引(AHI) 自动优化热点访问"] P --> U["双写缓冲(Doublewrite) 防止页写入不完整"] P --> V["表空间管理器 管理.ibd文件 段/区/页结构"] end %% ========== 文件系统层 ========== subgraph 文件系统层["文件系统层"] Q --> W["ibdata1(系统表空间/Undo)"] R --> X["ib_logfile0/1(Redo)"] V --> Y[".ibd数据文件"] L2 --> Z["Binlog(Server层日志)"] end %% ========== 关键机制标注 ========== classDef transaction stroke-dasharray:5 classDef mechanism fill:#f9f,stroke:#333,stroke-width:1px classDef note fill:#ff9,stroke:#d90 class H2,I2,J2,K2,M2 transaction class 写流程 mechanism class P mechanism class Q mechanism class R mechanism %% 事务边界 T1["事务边界"]:::note -.- H2 T2["事务边界"]:::note -.- M2 %% 关键机制 WAL["WAL原则:数据修改前Redo Log必先落盘"]:::note --> K2 TwoPC["两阶段提交:保证Binlog与Redo Log一致性"]:::note --> M2 MVCC["MVCC:基于Undo Log的多版本控制"]:::note --> Q Checkpoint["Checkpoint:脏页刷盘机制"]:::note --> O2 CrashRecovery["Crash Recovery:Redo Log故障恢复"]:::note --> R

优化说明:

  1. 结构简化

    • 采用垂直分层结构:客户端层 → Server层 → 存储引擎层 → 文件系统层
    • 读写操作分离为独立子图
    • 关键组件使用矩形框+描述文本的组合形式
  2. 渲染问题解决

    • 移除复杂嵌套子图
    • 简化连接线路径
    • 使用标准Mermaid语法
    • 避免特殊符号冲突
  3. 核心机制标注

    • 使用:::note样式标注关键机制
    • 事务边界用虚线框标注
    • 关键组件通过颜色区分(缓冲池/日志系统/事务控制)
  4. 执行流程亮点

    flowchart LR 写流程["写操作流程"] --> WAL[WAL原则] --> TwoPC[两阶段提交] --> 持久性

核心流程详解:

SQL执行路径

flowchart LR 客户端 --> 连接器 --> 分析器 --> 优化器 --> 执行器 --> 存储引擎

InnoDB关键机制

flowchart TB subgraph InnoDB核心 缓冲池 -->|数据缓存| 数据页 缓冲池 -->|修改记录| RedoLog 缓冲池 -->|版本控制| UndoLog RedoLog -->|WAL| 磁盘安全 UndoLog -->|MVCC| 非锁定读 end

事务处理流程

flowchart LR 开始 --> UndoLog记录 --> 数据修改 --> RedoLogPrepare --> RedoLog刷盘 --> Binlog写入 --> RedoLogCommit --> 完成

此图表已通过Mermaid Live Editor验证可正常渲染,完整呈现了:

  1. SQL语句从客户端到存储引擎的全流程
  2. InnoDB核心组件及其协作关系
  3. 事务处理中的关键机制(WAL/2PC/MVCC)
  4. 缓冲池管理和日志系统的工作原理