数据库查询优化-explain
在 MySQL 中,EXPLAIN
是一个非常有用的命令,用于分析 SQL 查询的执行计划。通过 EXPLAIN
,可以了解 MySQL 是如何执行查询的,包括表的访问顺序、使用的索引、连接类型等信息。这对于优化查询性能非常有帮助。
基本用法
EXPLAIN [SQL查询语句];
例如:
EXPLAIN SELECT * FROM users WHERE age > 25;
输出字段解释
EXPLAIN
的输出结果通常包含以下字段:
-
id
-
查询的序列号。如果查询中包含子查询或联合查询,每个子查询或联合查询都会有一个不同的
id
。一般来说,id
越小,查询的优先级越高。
-
查询的序列号。如果查询中包含子查询或联合查询,每个子查询或联合查询都会有一个不同的
-
select_type
-
查询的类型。常见的值包括:
-
SIMPLE
:简单查询,不包含子查询或联合查询。 -
PRIMARY
:最外层的查询。 -
SUBQUERY
:子查询中的第一个SELECT
。 -
DERIVED
:派生表(子查询在FROM
子句中)。 -
UNION
:联合查询中的第二个及后续的SELECT
。 -
UNION RESULT
:联合查询的结果。
-
-
查询的类型。常见的值包括:
-
table
- 当前查询涉及的表名。
-
partitions
- 如果表被分区,显示查询涉及的分区信息。如果没有分区,该列为空。
-
type
-
表示 MySQL 在表中查找数据时的访问类型。常见的值包括:
-
ALL
:全表扫描,性能最差。 -
index
:索引全扫描,比全表扫描稍好,但仍然需要扫描整个索引。 -
range
:索引范围扫描,比全索引扫描好,但仍然需要扫描部分索引。 -
ref
:非唯一索引扫描,使用索引查找特定值。 -
eq_ref
:唯一索引扫描,通常用于主键或唯一索引。 -
const
:常量扫描,通常用于主键或唯一索引的等值查询。 -
system
:表中只有一行数据,性能最好。
-
-
表示 MySQL 在表中查找数据时的访问类型。常见的值包括:
-
possible_keys
- 显示可能被查询使用的索引。如果为空,表示没有合适的索引可以使用。
-
key
- 实际使用的索引。如果为空,表示没有使用索引。
-
key_len
- 使用的索引的长度(以字节为单位)。一般来说,长度越短,索引的效率越高。
-
ref
-
显示索引的哪一列被用于比较。如果是
const
,表示使用了常量值。
-
显示索引的哪一列被用于比较。如果是
-
rows
- 估计需要扫描的行数。这个值越小,查询性能越好。
-
filtered
- 表示通过条件过滤后的行数比例(以百分比表示)。值越接近 100,表示过滤效果越好。
-
Extra
-
包含额外的信息,帮助理解 MySQL 是如何执行查询的。常见的值包括:
-
Using index
:表示使用了覆盖索引,不需要回表查询。 -
Using where
:表示使用了WHERE
子句过滤数据。 -
Using temporary
:表示需要创建临时表来存储中间结果。 -
Using filesort
:表示需要进行文件排序操作,性能较差。 -
Using join buffer
:表示使用了连接缓冲区。 -
Impossible WHERE
:表示WHERE
子句的条件永远不成立。
-
-
包含额外的信息,帮助理解 MySQL 是如何执行查询的。常见的值包括:
示例
假设有一个 users
表,包含以下字段:
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
email VARCHAR(50),
INDEX idx_age (age)
);
执行以下查询:
EXPLAIN SELECT * FROM users WHERE age > 25;
可能的输出结果如下:
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | users | NULL | range | idx_age | idx_age | 4 | NULL | 100 | 100.00 | Using where |
解释:
-
id
:1,表示这是最外层的查询。 -
select_type
:SIMPLE,表示这是一个简单查询。 -
table
:users,表示查询涉及的表。 -
type
:range,表示使用了索引范围扫描。 -
possible_keys
:idx_age,表示可能使用的索引。 -
key
:idx_age,表示实际使用的索引。 -
key_len
:4,表示索引的长度。 -
rows
:100,表示估计需要扫描的行数。 -
filtered
:100.00,表示过滤后的行数比例。 -
Extra
:Using where,表示使用了WHERE
子句过滤数据。
如何优化查询
-
检查索引
-
确保查询中使用了合适的索引。如果
possible_keys
和key
都为空,表示没有使用索引,需要考虑添加索引。
-
确保查询中使用了合适的索引。如果
-
减少扫描行数
-
尽量减少
rows
的值。可以通过优化查询条件或调整索引结构来实现。
-
尽量减少
-
避免全表扫描
-
如果
type
是ALL
,表示进行了全表扫描,性能较差。尽量通过索引优化查询。
-
如果
-
减少临时表和文件排序
-
如果
Extra
中包含Using temporary
或Using filesort
,表示查询性能较差。可以通过优化查询或调整索引结构来避免这些操作。
-
如果
-
覆盖索引
-
如果查询的字段都在索引中,MySQL 可以直接使用索引返回结果,而不需要回表查询。这种情况下,
Extra
中会显示Using index
。
-
如果查询的字段都在索引中,MySQL 可以直接使用索引返回结果,而不需要回表查询。这种情况下,
通过 EXPLAIN
命令,可以深入了解 MySQL 的查询执行计划,从而优化查询性能。
« 交易所撮合交易的关键技术点
|
JWT身份验证介绍»
日历
个人资料

diaba 寻求合作请留言或联系mail: services@jiucaiyuan.net
链接
最新文章
存档
- 2025年4月(17)
- 2025年3月(25)
- 2025年2月(20)
- 2025年1月(2)
- 2024年10月(1)
- 2024年8月(2)
- 2024年6月(4)
- 2024年5月(1)
- 2023年7月(1)
- 2022年10月(1)
- 2022年8月(1)
- 2022年6月(11)
- 2022年5月(6)
- 2022年4月(33)
- 2022年3月(26)
- 2021年3月(1)
- 2020年9月(2)
- 2018年8月(1)
- 2018年3月(1)
- 2017年3月(3)
- 2017年2月(6)
- 2016年12月(3)
- 2016年11月(2)
- 2016年10月(1)
- 2016年9月(3)
- 2016年8月(4)
- 2016年7月(3)
- 2016年6月(4)
- 2016年5月(7)
- 2016年4月(9)
- 2016年3月(4)
- 2016年2月(5)
- 2016年1月(17)
- 2015年12月(15)
- 2015年11月(11)
- 2015年10月(6)
- 2015年9月(11)
- 2015年8月(8)
分类
热门文章
- SpringMVC:Null ModelAndView returned to DispatcherServlet with name 'applicationContext': assuming HandlerAdapter completed request handling
- Mac-删除卸载GlobalProtect
- java.lang.SecurityException: JCE cannot authenticate the provider BC
- MyBatis-Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}
- Idea之支持lombok编译
标签
最新评论
- logisqykyk
Javassist分析、编辑和创建jav... - xxedgtb
Redis—常见参数配置 - 韭菜园 ... - wdgpjxydo
SpringMVC:Null Model... - rllzzwocp
Mysql存储引擎MyISAM和Inno... - dpkgmbfjh
SpringMVC:Null Model... - tzklbzpj
SpringMVC:Null Model... - bqwrhszmo
MyBatis-Improper inl... - 乐谱吧
good非常好 - diaba
@diaba:应该说是“时间的度量依据”... - diaba
如果速度增加接近光速、等于光速、甚至大于...
最新微语
- 在每件事情上花费的东西,就是生命的一部分,而我们花费的这些东西要求立即得到回报,或者在一个长时间以后得到回报。
2025-01-23 15:46
- 诺曼·文森特说:“并不是你认为自己是什么样的人,你就是什么样的人。但是你的思想是什么样,你就是什么样的人。”
2025-01-23 15:44
- 从今天起,做一个幸福的人。喂马,砍柴,(思想)周游世界
2022-03-21 23:31
- 2022.03.02 23:37:59
2022-03-02 23:38
- 几近崩溃后,找到解决方法,总是那么豁然开朗!所以遇到问题要坚持!
2018-07-18 10:49
发表评论: