MySQL的执行流程

目录

一、整体流程总览

二、逐渐段详细拆解

[1、客户端 ->连接器(Connection)](#1、客户端 ->连接器(Connection))

[2、连接表 ->查询缓存(Query Cache)](#2、连接表 ->查询缓存(Query Cache))

[3、连接器 ->分析器(Parser)](#3、连接器 ->分析器(Parser))

[4.分析器 -> 优化器(Optimizer)](#4.分析器 -> 优化器(Optimizer))

[5.优化器 -> 执行器(Executor)](#5.优化器 -> 执行器(Executor))

[6、执行器 -> 存储引擎(Storage Engine)](#6、执行器 -> 存储引擎(Storage Engine))

三、完整示例:

四、补充说明:为什么这个流程很重要?


一、整体流程总览

一条SELECT语句在MySQL里,从客户端发出到拿到结果,要经历这几个核心阶段:

  1. 连接器:建立连接、验证权限。

  2. 查询缓存:看看有没有现成结果。

  3. 分析器:词法 + 语法分析,解析 SQL。

  4. 优化器:生成执行计划,选索引、定执行顺序。

  5. 执行器:按计划调用存储引擎,拿到数据。

  6. 存储引擎:负责数据的读写。

二、逐渐段详细拆解

1、客户端 ->连接器(Connection)

作用:

  1. 管理客户端与MySQL的连接(TCP/IP、Socket等)。
  2. 验证用户名、密码是否正确
  3. 校验用户是否有对应表/列的查询权限

细节:

  1. 连接成功后,会维持一个会话,后续的所有请求都走这个连接。
  2. 权限是在连接建立时就验证好的,后续执行时不会再重复校验(除非权限被修改并刷新)。

2、连接表 ->查询缓存(Query Cache)

**注:**MySQL 8.0 版本已经彻底移除了查询缓存功能,因为它在高并发场景下效率极低,反而会拖慢性能。

作用:

  1. 直接用SQL语句作为key,查询结果作为value缓存起来。
  2. 如果缓存命中,直接返回结果,跳过后续所有步骤

为什么被移除:

只要表有任何数据修改(增删改),该表的所有缓存都会失效,高并发场景下缓存命中极低,维护成本极高

3、连接器 ->分析器(Parser)

如果缓存没命中(或没有缓存),就进入分析器阶段,分两步:

词法分析:

  1. 把整条SQL拆成一个个"词(Token)",比如SELECT、id、FROM、user等关键词、标识符。

语法分析:

  1. 根据MySQL的语法规则,检查SQL是否合法(比如少写了分号、关键词写错、表名不存在等)。
  2. 生成一颗抽象语法树(AST),方便后续优化器处理。

常见报错场景:

  • 这里报的错一般是 You have an error in your SQL syntax,就是语法分析阶段发现的问题。

4.分析器 -> 优化器(Optimizer)

分析器只保证SQL语法正确,但"怎么执行最快"是优化器决定的。

  • 核心工作:
  1. **生成多种执行方案:**如果多表连接的顺序、索引的选择、是否用临时表 / 排序等。
  2. **成本估算:**根据统计信息(索引基数、行数等),计算每个方案的执行成本。
  3. **选出最优执行计划:**最终确定一条执行路劲。
  • 典型优化场景:
  1. 同一个SELECT可以选不同的索引,优化器会选成本最低的那个。
  2. 多表JOIN时,决定哪个表作为驱动表,减少循环次数。
  • 查看方式:
  1. 可以用EXPLAIN SELECT ...查看优化器生成的执行计划。

5.优化器 -> 执行器(Executor)

优化器生成了执行计划,接下来就由执行器来"干活"了。

  • 核心工作:
  1. 再次校验用户是否有操作该表 / 列的权限(防止优化阶段权限被修改)。
  2. 按照执行计划,调用存储引擎提供的接口(比如open table、read row)。
  3. 循环读取数据,过滤条件,拼接结果集。
  • 和存储引擎的交互:
  1. 执行器只负责 "逻辑执行",数据的实际读写由存储引擎完成。
  2. 比如 InnoDB 提供了事务、行锁、MVCC 等能力,执行器会调用对应的接口。

6、执行器 -> 存储引擎(Storage Engine)

存储引擎是MySQL的底层模块,负责数据的持续化和读写。

  • 常见引擎:
  1. InnoDB:MySQL 5.5+ 默认引擎,支持事务、行锁、MVCC、外键,是业务首选。
  2. MyISAM:不支持事务和行锁,只支持表锁,适合读多写少的场景,现在基本被淘汰。
  • 工作流程:
  1. 执行器调用存储引擎的接口,存储引擎从磁盘 / 内存中读取数据,返回给执行器。
  2. 比如 InnoDB 会先从缓冲池(Buffer Pool)找数据,找不到再从磁盘读取。

三、完整示例:

以SELECT name FROM user WHERE id = 1;为例:

  1. 客户端发送 SQL → 连接器建立连接,验证权限。
  2. 连接器检查查询缓存(如果有),没命中 → 进入分析器。
  3. 分析器解析 SQL,拆词、语法校验,生成 AST。
  4. 优化器分析:id 是主键,选主键索引,生成执行计划。
  5. 执行器按计划调用 InnoDB 的接口,查询 id=1 的数据。
  6. InnoDB 从缓冲池 / 磁盘读取数据,返回给执行器。
  7. 执行器拼接结果,返回给客户端。

四、补充说明:为什么这个流程很重要?

理解这个流程,能帮你解决很多实际问题:

  • 为什么 SELECT加了索引还是慢?→ 可能优化器没选对索引,或者统计信息过时了。
  • 为什么 MySQL 8.0 之后查询缓存没了?→ 它的弊端远大于收益。
  • 权限验证为什么要做两次?→ 防止优化阶段权限被修改,保证安全。
相关推荐
FYKJ_20107 小时前
springboot雅集社区养老管理系统04456-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·typescript·spark·django
FYKJ_20107 小时前
express皖美特色农产品网售系统53118-计算机课程设计、毕业设计
javascript·vue.js·spring boot·mysql·typescript·spark·express
FYKJ_20107 小时前
springboot羽毛球场地管理系统00626-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·typescript·spark·django
FYKJ_20108 小时前
django药饮个性化推荐系统54839-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·typescript·spark·django
IT枫斗者枫哥13 小时前
MyBatis一对多分页:LIMIT 20,为什么凑不齐20个订单?
java·数据库
Flynt13 小时前
"MySQL搜不动就上ES"?我先在50万行数据上测了它自带的ngram全文索引
mysql·elasticsearch·搜索引擎
Y0013 小时前
PostgreSQL 的锁:为什么你的 ALTER TABLE 会卡住,以及怎么查
数据库·postgresql
imDwAaY14 小时前
Redo Log 和 Binlog 为什么需要两阶段提交?
后端·mysql
灰原喜欢柯南14 小时前
OceanBase 运维管理知识点——OCP 监控、诊断与变更控制
数据库·oceanbase
码农-00414 小时前
Springboot 集成 Ehcache操作数据库显示SQL语句设置
数据库·spring boot·sql