MySQL Explain 返回列详解:从入门到实战,附 SQL 与避坑大全

Mysql Explain执行计划详解 有了慢查询语句后,就要对语句进行分析。一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。EXPLAIN语句来帮助我们查看某个查询语句的具体执行计划,我们需要搞懂EPLATNEXPLAIN的各个输出项都是干嘛使的,从而可以有针对性的提升我们查询语句的性能。 阅读详情

本文基于 MySQL 5.7+ 和 8.0+ 版本梳理,适用于大多数 MySQL 版本。建议收藏,方便日后 SQL 优化查阅。

一、Explain 是什么?

Explain​ 是 MySQL 提供的查询执行计划分析工具。它通过模拟优化器的执行过程,告诉你一条 SQL 语句将如何读取数据、是否使用索引、扫描多少行等关键信息,是 SQL 性能优化的“透视镜”。

核心作用

  1. 查看表的读取顺序:了解多表关联时谁先谁后。

  2. 判断索引使用情况:确认是否走索引,避免全表扫描。

  3. 预估查询成本:通过 rows字段估算扫描行数,定位性能瓶颈。

  4. 识别额外操作:发现 Using filesort(文件排序)、Using temporary(临时表)等性能杀手。

二、Explain 用法与语法

1. 基础用法(最常用)

直接在 SQL 语句前加上 EXPLAIN即可。

-- 分析单表查询
EXPLAIN SELECT * FROM user WHERE age > 18;

-- 分析多表连接
EXPLAIN SELECT u.name, o.amount 
FROM user u 
JOIN orders o ON u.id = o.user_id 
WHERE u.city = 'Beijing';

2. 进阶用法(MySQL 8.0+)

MySQL 8.0 提供了更强大的分析能力。

-- 1. 实际执行并分析(显示实际耗时,MySQL 8.0.18+)
EXPLAIN ANALYZE SELECT * FROM user WHERE age = 25;

-- 2. JSON 格式输出(包含更详细的成本模型数据)
EXPLAIN FORMAT=JSON SELECT * FROM user WHERE age = 25;

三、Explain 返回列详解(核心)

执行 EXPLAIN后,你会看到一张包含约 12 列的结果表。以下是每列的核心解读与实战关注点。

列名

含义

核心关注点

id​

查询序列号

判断执行顺序(id 越大越先执行)

select_type​

查询类型

区分简单查询、子查询、UNION

table​

访问的表名

当前行数据属于哪张表

partitions​

匹配的分区

若为分区表,显示命中的分区

type​

访问类型​

性能关键!(如 const, ref, ALL)

possible_keys​

可能使用的索引

优化器理论可选的索引

key​

实际使用的索引​

实际走的索引(NULL 表示未走索引)

key_len​

索引长度

判断联合索引中实际使用了多少列

ref​

索引引用

显示与索引比较的列或常量

rows​

预估扫描行数​

越小越好,是估算值

filtered​

过滤百分比

表示条件过滤后剩余数据的比例

Extra​

额外信息​

性能优化的关键提示(如 Using index)

四、核心列深度解析(附 SQL 示例)

1. type列:访问类型(性能核心)

type表示 MySQL 如何查找表中的行,性能从优到劣排序如下:

类型

含义

示例 SQL(假设有索引)

system​

表只有一行(系统表)

SELECT * FROM mysql.time_zone WHERE ...

const​

最优,通过主键/唯一索引一次找到

SELECT * FROM user WHERE id = 1

eq_ref​

多表 JOIN 时,被驱动表使用主键/唯一索引

SELECT * FROM a JOIN b ON a.id = b.id(b.id 是主键)

ref​

常见,使用普通索引等值匹配(可能多行)

SELECT * FROM user WHERE age = 25(age 有索引)

range​

索引范围扫描(BETWEEN, IN, >, <)

SELECT * FROM user WHERE age > 20

index​

全索引扫描(遍历索引树)

SELECT age FROM user(age 有索引)

ALL​

全表扫描(性能最差,需优化)

SELECT * FROM user WHERE name = 'John'(name 无索引)

优化建议:生产环境至少应达到 range级别,尽量避免 ALL(全表扫描)。

2. key与 possible_keys:索引使用

  • possible_keys:理论上可能用到的索引(仅供参考)。

  • key:实际使用的索引。

常见问题分析:

  • key为 NULL:说明未使用索引,需检查查询条件或建索引。

  • possible_keys有值但 key为 NULL:通常因为数据量小或索引区分度低,优化器认为全表扫描更快。

3. Extra列:额外信息(优化关键)

Extra列提供了极其重要的性能线索。

值

含义

优化建议

Using index​

覆盖索引(极佳)

查询列全在索引中,无需回表。

Using where​

使用 WHERE 过滤

正常情况,表示在存储引擎层或 Server 层进行了过滤。

Using filesort​

文件排序(需优化)

无法利用索引排序,需额外排序操作。考虑为 ORDER BY字段加索引。

Using temporary​

临时表(需优化)

常见于 GROUP BY、DISTINCT操作。需为分组字段加索引。

Using join buffer​

使用连接缓存

连接条件未使用索引,导致使用内存缓存。

4. rows与 filtered:扫描成本

  • rows:MySQL 预估需要扫描的行数(估算值,非精确值)。越小越好。

  • filtered:表示经过 WHERE条件过滤后,剩余行数的百分比。rows * filtered可估算连接查询中下一张表需要处理的行数。

五、实战案例:SQL 优化前后对比

场景:无索引导致全表扫描(type=ALL)

问题 SQL:

EXPLAIN SELECT * FROM orders WHERE user_id = 100;

执行计划分析:

id

type

key

rows

Extra

1

ALL​

NULL

10000

Using where

诊断:type=ALL表示全表扫描,key=NULL表示未使用索引,rows=10000表示扫描了 1 万行,性能极差。

优化方案:为 user_id添加索引。

CREATE INDEX idx_user_id ON orders(user_id);

优化后执行计划:

id

type

key

rows

Extra

1

ref​

idx_user_id

1

Using index

优化效果:type从 ALL提升为 ref(索引等值匹配),rows从 10000 降为 1,性能提升千倍。

六、总结:Explain 分析 checklist

  1. 看 type:是否出现 ALL(全表扫描)?必须优化。

  2. 看 key:是否实际使用了索引?key不应为 NULL。

  3. 看 Extra:是否出现 Using filesort或 Using temporary?这两个是性能杀手,需通过调整索引或 SQL 写法消除。

  4. 看 rows:预估扫描行数是否过大?过大说明索引可能失效或缺失。

版权声明:本文为 优快云 博主原创,转载请注明出处。如有疑问,欢迎评论区交流。

参考来源:MySQL 官方文档、腾讯云开发者社区、脚本之家等。

从零开始利用MATLAB进行FPGA设计(六)用ADC采集信号教程1 用AN9238采集信号的方法(1),包含PLL、FIFO、ILA的基础教程。 阅读详情

相关推荐

别再手动配IP了!保姆级教程:用Cisco Packet Tracer搞定DHCP服务器配置(附实验抓包分析)

本文提供了一份详细的Cisco Packet Tracer DHCP服务器配置教程,帮助用户告别手动分配IP的繁琐过程。通过构建多子网实验环境,逐步指导DHCP地址池设置、客户端测试及协议分析,并分享常见问题排查技巧,让网络配置更高效、更智能。

weixin_42535461的博客 337

【数据库SQL系列】sql优化,你学废了吗

目录 1.序言 2.SQL优化 2.1 为什么要做sql优化 2.2 sql优化的那些方式 2.2.1 慢sql发现 2.2.2explain sql分析 2.2.3 sql优化的那些操作 3.总结 1.序言 对于一个系统而言,要想达到高可用,需要从架构,程序设计,网络层面以及数据库层面都保证一个较优的设计与使用。而数据库...

Yangy的博客 1万+

AIGC在游戏行业的应用:革新游戏开发与体验

AIGC(人工智能生成内容)技术正在深刻改变游戏行业,从开发到体验全面革新。在游戏开发中,AIGC可用于自动生成关卡、角色和剧情,提升开发效率;在资源制作中,通过AI生成场景、角色模型等,降低成本。

1664

mysql explain详解

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 先解析一条sql语句,看出现什么内容 EXPLAINSELECTs.uid,s.username,s.name,f.email,f.mobile,f.phone,f.postalcode,f.address FROM uchome_space ASs,uchome_

pan-zy的专栏 995

手把手教你用VSCode+MCUXpresso搭建i.MX RT1062开发环境(附RT-Thread Nano移植)

本文详细介绍了如何使用VSCode和MCUXpresso工具链搭建i.MX RT1062开发环境,包括工具链安装、工程配置、调试技巧以及RT-Thread Nano实时操作系统的移植方法。通过实战步骤和优化建议,帮助开发者快速掌握这款高性能Cortex-M7 MCU的开发流程,提升嵌入式开发效率。

weixin_27014595的博客 391

别再只调PID了!手把手教你从LC谐振到检波,搞定STM32智能车电磁循迹硬件电路

本文深入解析STM32智能车电磁循迹硬件电路设计,从LC谐振选频到数字信号处理,提供完整的信号链路设计要点与实战技巧。通过优化电磁杆布局和信号放大电路,显著提升赛道位置检测精度,误差可控制在±0.5cm以内,为智能车竞赛提供可靠硬件支持。

weixin_29220405的博客 263

Explain是什么?能干嘛?怎么玩?

本教程中所使用的数据库的建表语句都在“MySQL高阶教程索引”这篇文章中,点击链接直达:索引&建表语句 摘要:本文主要介绍MySQL自带的性能分析工具Explain Explain是什么?能干嘛?怎么玩? explain的使用: #在查询语句前面加上一个explain即可,如: explain select * from department; 包含字段: ...

待到春花烂漫时 2691

从工艺文件到寄生分析:手把手教你用华大九天RCExplorer做版图预检(附ITF文件解析)

本文详细介绍了华大九天RCExplorer工具在模拟IC和版图设计中的应用,从工艺文件解析到寄生参数提取的全流程。通过ITF文件的深度解析和实战案例,帮助工程师掌握金属层、介质层及通孔参数的关键影响,提升设计效率与准确性。文章还提供了与StarRC工作流集成的实用技巧,是国产EDA工具应用的权威指南。

weixin_42522552的博客 405

MYSQL explain详解

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

zhuxineli的专栏 21万+

SAP BOM (物料清单) 详解

BOM(Bill of Materials,物料清单)是制造业和生产管理中的一个核心概念。它列出了生产某种产品所需的所有原材料、零部件和子组件的详细信息。在SAP系统中,BOM管理是为了帮助企业在生产过程中更高效地管理物料需求、库存以及生产成本。BOM不仅包括物料的数量和单位,还详细描述了每个物料的规格、标准和在产品中的位置。

我小时候很黑的博客 4243

如何使用 Claude Code 搜索 SAP note

当然,Claude Code 自己仍然要有一种合法可用的模型访问方式,例如 Claude 订阅、Anthropic API 或公司配置的模型提供方式,这和 Browser Extension 是两个问题。因为 Claude Code 已经是完整的 MCP Host,而 Microsoft Playwright MCP 又已经明确支持现有 Chrome Session,两者拼起来在技术架构上完全成立。Microsoft Playwright MCP 默认可以创建持久化浏览器 Profile。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 62

Explain使用简介

Explain使用简介什么是explainexplain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL。分析你的查询语句或是表结构性能瓶颈。如何使用explain SQL语句返回的内容: (1) id: select 查询的序列号,包含一组数字,表示查询中select子句或操作表顺序。 id相同,执行顺序由上至下。 id不同,如果是子查询,id序号会递增,id值

我的博客 896

GameFramework框架详解之 Network网络框架

NetworkManager只负责维护NetworkChannel,实际的有种我们简历网络连接的也是NetworkChannel作为一个网路频道,这样管理起来比较方便,比如:一个游戏可能有多个网络连接,那么我们建立多个网络频道即可,或者当我们一个网络频道断线后,我们可以直接再新建一个,防止数据混乱。/// /// 网络管理器。/// /// 网络频道。/// 用户自定义网络错误事件。/// 检查是否存在网络频道。/// 获取网络频道。/// 获取所有网络频道。

TxNet 3366

轻松上手MYSQL:SQL优化之Explain详解

本文深入解析了EXPLAIN命令在数据库查询优化中的作用,详细列出了其返回的关键列及其意义。涵盖了id、select_type、table、partitions、type、possible_keys、key、key_len(包括其计算方法与示例)、ref、rows、filtered和Extra等字段的说明。特别强调了key_len的计算,通过具体类型举例,帮助读者更准确地理解每个字段在查询性能分析中的作用,为数据库优化提供有力支持。

制定明确可量化的目标,坚持默默的做事。 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Mysql优化】EXPLAIN 返回列详解:深入 SQL 查询优化的工具

EXPLAIN是 MySQL 提供的分析查询计划的命令,执行后会返回一张表格,展示 SQL 查询在实际执行时会采用的策略。是否进行了全表扫描。索引是否被正确利用。哪些地方需要优化。通过对EXPLAIN返回列的理解和应用,我们可以识别查询的性能瓶颈。使用合适的索引,避免全表扫描。优化子查询,尽量减少嵌套层级。使用EXPLAIN定位问题,逐步优化查询结构。总是学不会.

学不会就接着学 1539

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

MySQL Explain 详解:从入门到精通,让你的 SQL 飞起来

EXPLAIN是 MySQL 提供的一个诊断工具,它可以模拟 MySQL 优化器执行 SQL 语句的过程,输出 SQL 语句的执行计划。通过分析执行计划,我们可以了解 SQL 的执行细节,从而发现潜在的性能问题,进行针对性优化。

果酱 の 博客 1242

MySQL之Explain各列详解-笔记

Explain各列详解 explain 语句执行后返回id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra列。 1、id列 id列的编号是select的序列号,有几个select就有几个id,并且id的顺序是按照select出现顺序增长的,MySQL将select查询分为简单查询(SIMPLE)和复杂查询(PRIMARY)。 复杂查询分为三类:简单子查询、派生表(from语句中的子查询)、union查询。 id列越大执行优先级越

T_chuxin的博客 2073

MySQL-explain详解说明

MySQL的explain使用字段说明

weixin_37799575的博客 4801

【MySQL之Explain详解】

本文介绍了MySQL中EXPLAIN关键字的作用及返回字段含义。EXPLAIN用于分析SQL执行计划,帮助优化慢查询。重点解析了id(执行顺序)、select_type(查询类型)、table(访问表)、type(访问方式)等关键列

qq_40864151的博客 1769

【MySQL】Explain详解与索引优化实战

目录 1、使用的表 2、explain 中的列 2.1 id列 1)简单子查询 2)from子句中的子查询 3)union查询 2.2 select_type列 2.3 table列 2.4 type列 2.5 possible_keys列 2.6 key列 2.7 key_len列 2.8 ref列 2.9 rows列 2.10 Extra列 3、索引优化实战 ...

小七的博客 1486

Mysql中explain命令返回参数详解

explain 是MySql提供的SQL语句查询性能的工具,是我们优化SQL的重要指标手段,要看懂explain返回的结果集就尤为重要,这篇文章主要介绍了MySql explain命令返回结果解读,需要的朋友可以参考下。

APTX_869的博客 2087

『Mysql进阶』Mysql explain详解(五)

EXPLAINEXPLAIN 语句提供有关 MySQL 如何执行语句的信息,使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。我们根据 MySQL 的慢查询慢查询慢查询去记录一些执行时间比较久的SQL语句, 然后使用explain命令来查看这些SQL语句的执行计划, 根据执行计划内容,判断该SQL语句有没有使用上索引, 有没有做全表扫描等, 进而排查出SQL执行慢的原因。

gorgor在码农 1823

【MySQL01】【 Explain 命令详解】

最近在读《MySQL 是怎样运行的》一书,后续会随机将书中部分内容记录下来作为学习笔记,部分内容经过个人删改,因此可能存在错误,如想详细了解相关内容强烈推荐阅读该书。

猫吻鱼的博客 1326

MySQL EXPLAIN 详解 及 SQL调优实战

MySQL EXPLAIN 详解 及 SQL调优实战

u014212540的博客 2365

Mysql的Explain详解

Mysql的Explain详解1、什么是Explain?2、Explain的两个变种2.1、explain extended2.2、explain partitions3、explain展示出来的数据列详解3.1、id列3.2、select_type列3.2.1、simple---简单查询3.2.2、primary---复杂查询3.2.3、subquery---子查询3.2.4、derived---衍生查询3.2.5、union---联合查询3.3、table列3.4、type列3.4.1、const, s

qq_41931364的博客 5942

mysql之EXPLAIN 详解

EXPLAIN命令是 MySQL 查询优化的 “瑞士军刀”。熟练掌握EXPLAIN的输出字段含义,结合案例分析,能帮助我们深入理解 MySQL 执行计划,快速定位性能瓶颈,找到优化方案,构建高性能的 MySQL 应用。参考:https://relph1119.github.io/mysql-learning-notes/#/mysql ,推荐理解本文之后去看原书,原书有一定深度需前后贯穿仔细理解。

qq_43460315的博客 1845

用EXPLAIN扒光SQL底裤:老司机带你玩转MySQL性能分析(实战篇)!!!

曾经有个500万行的表查询要8秒,用EXPLAIN一看——type是index,Extra有Using filesort。把ORDER BY字段加到索引后,0.2秒搞定!这工具用好了,真的是事半功倍!!!(下次面试被问SQL优化,先把EXPLAIN的字段背熟,保证惊艳面试官!

Cyb3rMagnet的博客 1088
上一篇: Spring Cloud 概述
下一篇: Spring Cloud的注册中心和配置中心(Nacos)
StackNoOverflow
博客等级 码龄1年 22粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值