%% 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
优化说明:
-
结构简化:
- 采用垂直分层结构:客户端层 → Server层 → 存储引擎层 → 文件系统层
- 读写操作分离为独立子图
- 关键组件使用矩形框+描述文本的组合形式
-
渲染问题解决:
- 移除复杂嵌套子图
- 简化连接线路径
- 使用标准Mermaid语法
- 避免特殊符号冲突
-
核心机制标注:
- 使用
:::note样式标注关键机制 - 事务边界用虚线框标注
- 关键组件通过颜色区分(缓冲池/日志系统/事务控制)
- 使用
-
执行流程亮点:
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验证可正常渲染,完整呈现了:
- SQL语句从客户端到存储引擎的全流程
- InnoDB核心组件及其协作关系
- 事务处理中的关键机制(WAL/2PC/MVCC)
- 缓冲池管理和日志系统的工作原理