0

0

一条SQL语句从发送到返回经历了什么_mysql执行流程说明

P粉602998670

P粉602998670

发布时间:2026-01-04 10:39:10

|

752人浏览过

|

来源于php中文网

原创

mysql客户端sql经连接校验、语法解析生成select_lex、优化器重写统计选择执行路径、执行器调用引擎逐行读取并过滤、结果缓存后返回;全过程涉及权限、缓存、语法、成本估算、mvcc、网络缓冲等环节。

一条sql语句从发送到返回经历了什么_mysql执行流程说明

MySQL 客户端发来的 SQL 到底被怎么“拆解”的

MySQL 不是直接执行你写的 SQL 字符串,而是走一套完整的解析、优化、执行链路。真正决定性能的,往往不是 SELECT 写得多漂亮,而是这条语句在服务端经历了哪些环节、卡在哪一步。

SQL 进入 MySQL 后的第一关:连接与命令分发

客户端通过 TCP 或 Unix socket 连上 mysqld,发送的是一个带长度前缀的二进制包(COM_QUERY 协议包),不是纯文本流。MySQL 线程池拿到这个包后,先做基础校验:

  • 用户权限是否允许执行该语句(比如 SELECT 需要 SELECT 权限,哪怕只是查 information_schema
  • 是否命中查询缓存(MySQL 8.0 已移除,但 5.7 及以前仍存在,且默认关闭)
  • 语句长度是否超 max_allowed_packet 限制(超了会直接报错 Packets larger than max_allowed_packet bytes are not allowed

语法解析与逻辑计划生成:从字符串到可执行结构

过了连接层,SQL 字符串交给 SQL 解析器(基于 LALR(1) 的 yacc/bison 生成器)。它不关心表是否存在、字段有没有索引,只管是否符合语法规则:

  • SELECT * FROM t WHERE id = ? AND name LIKE '%x' → 合法
  • SELECT * FROM t WHERE id = ? ORDER BY → 报错:You have an error in your SQL syntax

解析成功后,生成 SELECT_LEX 结构体(MySQL 内部表示),包含 JOIN_LISTWHERE_CONDORDER_LIST 等子结构。这步不访问表,也不查元数据。

查询优化器干了什么:为什么 EXPLAIN 显示的执行顺序和你写的不一样

优化器才是真正的“决策者”。它拿到逻辑结构后,做三件事:

Avatar AI
Avatar AI

AI成像模型,可以从你的照片中生成逼真的4K头像

下载
  • 重写:把 OR 转成 UNION,把子查询转成 JOIN(如 IN (SELECT ...) 可能被物化)
  • 统计:读取 mysql.innodb_table_stats 和采样页估算行数(cardinality),决定驱动表顺序
  • 选择:对每个 JOIN 组合尝试 refrangeindex_merge 等访问方式,选成本最低的物理执行路径

这就是为什么你写 SELECT * FROM a JOIN b ON a.id = b.a_idEXPLAIN 却显示 b 是第一行——优化器认为先扫 b 再回表 a 更快。参数 optimizer_switch(如 firstmatch=off)会显著改变这个行为。

执行器调用存储引擎:真正读数据的那一步才开始 IO

优化器输出执行计划后,执行器按节点逐个调用接口。关键点在于:

  • 每行数据都由执行器从引擎拉取,不是引擎一次性返回结果集(除非是 SELECT ... INTO OUTFILE 这类特殊语句)
  • 如果走了索引,执行器调用 ha_innobase::index_read();如果是全表扫描,调用 ha_innobase::rnd_next()
  • 遇到 WHERE 条件,执行器自己再过滤一次(Condition pushdown 是引擎层做的优化,不是所有条件都能下推)
  • 事务隔离级别在这里起作用:RR 下的 SELECT 会构造 ReadView,MVCC 版本可见性判断由执行器完成

也就是说,WHERE id > 100 AND status = 'active',如果只有 id 有索引,status 的过滤是在 MySQL Server 层做的,不是 InnoDB。

结果返回与连接清理:别忽略网络和锁的残留影响

执行器拿到最终结果集后,并不立即发给客户端:

  • 先写入线程本地的 net_buffer(大小受 net_buffer_length 控制),攒够或遇到大字段才 flush
  • 如果用了 SQL_BUFFER_RESULT 提示,还会强制把结果暂存在临时表中,释放表锁更早
  • 语句结束 ≠ 连接释放:如果没显式 COMMITROLLBACK,事务状态仍保留,可能阻塞其他会话的 DDL

最常被忽略的是:长事务 + 大结果集会让 net_buffer 持续占用内存,且 SHOW PROCESSLIST 里看到的 StatusSending data,其实卡在网卡缓冲区或客户端收包慢,不是数据库慢。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1133

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

381

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2152

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

380

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1663

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

440

2024.04.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 847人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号