MySQL 中如何查看 SQL 的执行计划?

SQL 语句前面使用 EXPLAIN 关键字:

EXPLAIN SELECT * FROM users WHERE id = 1;

|-----------------|------------------------------------------------------------------------------------|
| 字段 | 含义 |
| id | 查询的序号(如果是子查询或联合查询,会有多个 id)。 |
| select_type | 查询的类型(简单查询、子查询、联合查询等)。 |
| table | 查询涉及的表名。 |
| partitions | 查询时使用的分区(如果表有分区)。 |
| type | 查询的访问类型(性能从高到低:system> const> eq_ref> ref> range> index> ALL)。 |
| possible_keys | 可能使用的索引。 |
| key | 实际使用的索引。 |
| key_len | 使用的索引长度。 |
| ref | 使用的索引与哪些列或常量进行比较。 |
| rows | 估算的扫描行数。 |
| filtered | 计算结果集占扫描行数的百分比(MySQL 5.7+)。 |
| Extra | 额外信息(如 Using whereUsing indexUsing temporary 等)。 |


EXPLAIN 的关键字段详解

**type:**表示 MySQL 如何访问数据,性能从高到低排序。

  • system:表中只有一行数据(系统表)。
  • const:通过主键或唯一索引查询,结果只有一行。
  • eq_ref:在连接查询中,主键或唯一索引被使用,返回最多一行。
  • ref:使用非唯一索引查询,返回匹配的多行。
  • range:使用索引进行范围查询(如 BETWEENIN)。
  • index:全索引扫描(比全表扫描快,但仍需遍历索引)。
  • ALL:全表扫描(性能最差)。

**Extra:**提供查询的额外信息

  • Using where:查询使用了 WHERE 条件。
  • Using index:使用了覆盖索引(无需回表)。
  • Using temporary:使用了临时表(常见于排序或分组)。
  • Using filesort:使用了文件排序(性能较低)。
  • Using join buffer:使用了连接缓存(多表连接时)。

如何分析 EXPLAIN 结果

通过 EXPLAIN 结果,可以优化查询:

1.检查 type

  • 目标是使用 consteq_refrefrange
  • 避免 ALL(全表扫描)。

2.检查 key

    • 确保查询使用了索引。
    • 如果没有使用索引,考虑添加合适的索引。

3.检查 rows

  • 估算的扫描行数越少越好。
  • 如果行数过多,优化查询条件或索引。

4.检查 Extra

  • 避免 Using temporaryUsing filesort
  • 尽量使用 Using index

水平有限,如有错误,欢迎指正!

相关推荐
SirLancelot16 分钟前
AI大模型-基本介绍(一)RAG、向量、向量数据库
数据库·人工智能·ai·向量·向量数据库·rag
李慕婉学姐12 分钟前
Springboot面向电商的仓库管理系统05uc4267(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
imbackneverdie16 分钟前
AI工具如何重塑综述写作新体验
数据库·人工智能·考研·自然语言处理·aigc·论文·ai写作
千寻技术帮43 分钟前
10379_基于SSM的校园跑腿服务平台
mysql·微信小程序·校园跑腿·ssm
Warren981 小时前
datagrip新建oracle连接教程
数据库·windows·云原生·oracle·容器·kubernetes·django
焦糖玛奇朵婷1 小时前
扭蛋机小程序:线上扭蛋机模式发展新形势[特殊字符]
大数据·数据库·程序人生·小程序·软件需求
YMatrix 官方技术社区1 小时前
YMatrix 高可用详解:3 种镜像策略在节点宕机时表现有何不同?
运维·数据库·数据仓库·ai·数据库开发·数据库架构·ymatrix
嘟嘟w1 小时前
SQL注入是什么
数据库·sql·oracle
摇滚侠1 小时前
Redis 零基础到进阶,Redis 主从复制,笔记55-62
数据库·redis·笔记
surtr11 小时前
数据库基础(数据库原理和应用)
数据库·sql·mysql·oracle·database