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. 返回结果

  • 执行器将最终结果集返回给客户端。
  • 可能还会经过网络层压缩、分包处理等。
  • 客户端获取并展示结果。

📌 举例说明

例如执行以下语句:
流程如下:
  1. 连接器接收请求。
  1. 解析器解析 SELECT 语句结构。
  1. 预处理器确认 users 表、agecreated_at 字段存在。
  1. 优化器判断是否能使用 agecreated_at 的索引。
  1. 执行器根据优化器生成的计划去调用 InnoDB 存储引擎。
  1. 过滤出 age > 25 的记录,排序、分页。
  1. 将结果集返回给客户端。

🔍 查看执行计划

可以分析使用了哪个索引、表的访问顺序、是否有文件排序、全表扫描等。

🧷 总结流程图


示例文章,调试站点可支持全部Notion组件的显示效果系统订单的超时取消功能如何设计?
Loading...
Sean Liu
Sean Liu
Stack the Code, Hack the World.
最新发布
深入理解Java中的双亲委派模型
2025-5-20
MySQL中一条SQL的执行过程
2025-5-20
系统订单的超时取消功能如何设计?
2025-5-20
机器学习 vs 深度学习:业务场景下的「尺长寸短」
2025-5-20
开源OCRmyPDF实战:让扫描文档重获新生的技术魔法
2025-5-20
Java泛型:PECS原则与Java中泛型的上下界限定符
2025-4-10
公告
 
We can only see a short distance ahead, but we can see plenty there that needs to be done.
目光所及之处,只是不远的前方,但那里已有太多值得去做的事在等待着我们。
 
—— Alan Turing 阿兰 · 图灵