当前位置: 首页 > news >正文

MySQL 查询执行流程全解析


引言

当你在 MySQL 中执行一条 SQL 查询时,背后隐藏着一套精密的协作机制。从解析器到存储引擎,从优化器到执行计划,每个环节都直接影响查询性能。
本文将通过 Mermaid 流程图 和 时序图,完整还原 SQL 查询的执行流程,并深入解析关键环节的优化策略。


一、整体执行流程概览

1.1 核心阶段划分

客户端发送SQL
语法解析
生成解析树
逻辑优化
生成执行计划
物理执行
返回结果集

1.2 关键组件角色

组件职责
解析器将 SQL 转换为抽象语法树(AST)
优化器选择最优执行计划(基于成本模型)
存储引擎实际读取/写入数据(如 InnoDB、MyISAM)
查询缓存缓存结果集(MySQL 8.0 已移除)

二、详细执行步骤解析

2.1 语法解析与解析树

示例 SQL:

SELECT u.name, o.amount 
FROM users u 
JOIN orders o ON u.id = o.user_id 
WHERE u.age > 25 
ORDER BY o.create_time DESC;

解析树结构(简化版):

Root
SelectFields
FromClause
WhereClause
OrderByClause
u.name
o.amount
u.id = o.user_id
u.age > 25
o.create_time DESC

2.2 逻辑优化策略

优化器决策树:

优化器行为示例:
• 索引选择:若 u.age 有索引,优先使用索引范围扫描。

• 连接顺序:小表驱动大表(如 users 表 100 行,orders 表 10 万行 → 先扫描 users)。


三、物理执行流程

3.1 执行计划生成

优化器生成执行计划
访问路径选择
IndexScan/RangeScan
TableScan
回表查询
直接读取数据

3.2 存储引擎交互时序

客户端 Server StorageEngine 发送SQL 提交执行计划 返回数据行 发送结果集(流式) loop [按行处理] 客户端 Server StorageEngine

四、关键性能影响因素

4.1 索引使用情况对比

场景执行时间I/O次数是否回表
使用覆盖索引0.1ms2次(索引树扫描)
使用普通索引+回表0.5ms3次(索引+数据页)✔️
全表扫描2.5ms10万次数据页读取

4.2 临时表与文件排序

触发条件:

-- 多字段排序且无复合索引
SELECT * FROM users 
ORDER BY create_time DESC, age ASC;

执行流程:

按create_time排序
生成临时表
按age二次排序
返回结果

五、实战优化技巧

5.1 索引优化

最左前缀原则应用:

-- 创建联合索引
CREATE INDEX idx_name_age ON users(name, age);-- 有效查询
SELECT * FROM users WHERE name LIKE 'A%' AND age=25;-- 无效查询(跳过name)
SELECT * FROM users WHERE age=25;

5.2 避免临时表

优化前:

SELECT u.name, COUNT(o.id) 
FROM users u 
LEFT JOIN orders o ON u.id = o.user_id 
GROUP BY u.id;

优化后(添加冗余索引):

ALTER TABLE orders ADD INDEX idx_user_id (user_id);

六、诊断工具使用

EXPLAIN 关键字段解读

EXPLAIN SELECT * FROM users WHERE id = 1;
字段含义
type访问类型(ALL=全表扫描)
key实际使用的索引
rows预估扫描行数
Extra是否使用临时表/文件排序

总结

MySQL 查询执行流程是 解析 → 优化 → 执行 的精密协作过程。理解以下核心原则可显著提升性能:

  1. 优先使用覆盖索引,避免回表开销。
  2. 控制连接条件顺序,利用小表驱动大表。
  3. 避免隐式类型转换,防止索引失效。

通过结合 EXPLAIN 分析和索引优化,开发者可以高效定位性能瓶颈。下一篇我们将深入探讨 InnoDB 的 MVCC 实现原理,敬请期待!

http://www.xdnf.cn/news/502183.html

相关文章:

  • IPD推行成功的核心要素(二十二)IPD流程持续优化性地推出具备商业成功潜力的产品与解决方案
  • 使用HtmlAgilityPack采集墨迹天气中的天气数据
  • 9.DMA
  • 如果丝杆有轴向窜动应如何处理?
  • 西门子 Teamcenter13 Eclipse RCP 开发 1.3 工具栏 单选按钮
  • 使用tensorRT10部署低光照补偿模型
  • 六、绘制图片
  • traceroute命令: -g与-i 参数
  • flutter长列表 ListView、GridView、SingleChildScrollView、CustomScrollView区别
  • 专题四:综合练习(组合问题的决策树与回溯算法)
  • 嘉立创EDA成图:文件管理
  • 【前端基础】11、CSS的属性特性(继承、层叠、元素类型、隐藏元素的四种方式)
  • 【笔记】正弦交流电路的特征量
  • MMDetection环境安装配置
  • 小蜗牛拨号助手用户使用手册
  • STM32中的DMA
  • Python自学笔记3 常见运算符
  • Redis 事务与管道:原理、区别与应用实践
  • 【JDBC】JDBC概述、历史版本及特征
  • 深入解析 React 的 useEffect:从入门到实战
  • (头歌作业)—6.1 葡萄酒评论分析报告(project)
  • DeepSeek超大模型的高效训练策略
  • 数据结构与算法——双向链表
  • 探秘 Java 字节缓冲流:解锁高效 IO 操作的进阶之路
  • Unity 人物模型学习笔记
  • MATLAB2025新功能
  • 开源项目实战学习之YOLO11:12.3 ultralytics-models-sam-encoders.py源码分析
  • gcc/g++常用参数
  • Go 语言的 GMP 模型
  • DeepSeek 赋能量子计算:突破与未来图景