author
type
status
date
slug
summary
tags
category
icon
password
🔄 整体流程概览(以 SELECT
为例)
🧩 1. 连接器(Connection Layer)
- 客户端通过 TCP 协议连接 MySQL 服务端。
- 连接器负责身份验证(账号、密码)、权限校验,以及维持连接状态(长连接/短连接)。
- 连接成功后进入连接池,MySQL 会为每个连接分配一个线程(或使用线程池)。
🗃️ 2. 查询缓存(MySQL 8.0 已移除)
- 在 MySQL 5.7 及以前版本中,MySQL 会先检查查询缓存中是否有命中:
- 如果缓存中有完全一样的 SQL 和其结果,直接返回缓存。
- 否则进入下一步。
🧮 3. 解析器(Parser)
- 对 SQL 进行词法分析和语法分析,生成 解析树(Parse Tree)。
- 会检查 SQL 是否存在语法错误,例如关键字拼写错误、缺失字段等。
🧹 4. 预处理器(Preprocessor)
- 进行语义分析,包括:
- 表名、字段名是否存在。
- 字段是否有权限访问。
- 数据类型是否匹配。
- 处理视图、子查询、函数调用等。
🧠 5. 查询优化器(Optimizer)
优化器是整个过程的核心,负责选择最优执行计划:
- 确定表的访问顺序(如多表 JOIN 时的顺序)。
- 选择使用哪个索引。
- 是否可以使用覆盖索引、索引下推。
- 选择执行算法(如 Nested Loop Join、Hash Join、Merge Join)。
- 最终生成 执行计划(Execution Plan)。
可以通过
EXPLAIN
命令查看执行计划。🛠️ 6. 执行器(Executor)
- 根据优化器生成的执行计划逐步执行 SQL。
- 执行器会调用底层的存储引擎 API,逐行读取数据、判断过滤条件(WHERE)、排序、聚合等。
- 示例流程如下:
- 执行器请求存储引擎读取数据块。
- 判断是否符合 WHERE 条件。
- 聚合/分组/排序。
- 将结果逐步写入结果集。
🗄️ 7. 存储引擎(Storage Engine)
- MySQL 支持多种存储引擎,最常见的是 InnoDB。
- 存储引擎负责数据的实际存取、索引维护、事务处理等。
- 执行器通过接口(Handler API)与引擎通信:
read_row()
、index_read()
、rnd_next()
等。
InnoDB 相关细节:
- 使用 B+ 树索引。
- 支持事务(ACID)、行级锁、MVCC(多版本并发控制)。
- 数据以页为单位缓存到内存(Buffer Pool)中。
📤 8. 返回结果
- 执行器将最终结果集返回给客户端。
- 可能还会经过网络层压缩、分包处理等。
- 客户端获取并展示结果。
📌 举例说明
例如执行以下语句:
流程如下:
- 连接器接收请求。
- 解析器解析
SELECT
语句结构。
- 预处理器确认
users
表、age
、created_at
字段存在。
- 优化器判断是否能使用
age
或created_at
的索引。
- 执行器根据优化器生成的计划去调用 InnoDB 存储引擎。
- 过滤出 age > 25 的记录,排序、分页。
- 将结果集返回给客户端。
🔍 查看执行计划
可以分析使用了哪个索引、表的访问顺序、是否有文件排序、全表扫描等。
🧷 总结流程图
- 作者:Sean Liu
- 链接:http://liusx.top/article/1f9749a0-584b-8080-a3b0-e4fd3f49f223
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。