mysql视频教程栏目介绍Explain 执行计划
推荐(免费):mysql视频教程
目录
- 1. 介绍
- 2. Explain 结果列详解
-
- 2.1 id
- 2.2 select_type
- 2.3 table
- 2.4 partitions
- 2.5 type(非常重要)
- 2.6 possible_keys
- 2.7 key
- 2.8 key_len
- 2.9 ref
- 3.10 rows
- 2.11 filtered
- 2.12 Extra
【注】
- 当前系统环境:
MySQL 5.7
,其他版本略有不同,后期会抽时间单独说明。 - 只介绍常见的场景,其他少见的场景暂不研究,如有需要可以去官方文档中查找。
- 非入门,需要对
MySQL
的底层数据结构B+
树有一定的了解。
文档参考:
MySQL 官方 Explain 文档
1. 介绍
使用 EXPLAIN
关键字可以模拟优化器执行 SQL
语句,并分析查询语句的性能瓶颈。
2. Explain 结果列详解
2.1 id
id
列的编号是select
的序列号,一般有几个select
就有几个id
(联表查询会有重复的id
),并且id
的顺序是按select
出现的顺序增长的。id
越大则表示执行的优先级越高,id
相同(一般出现在联表查询)则从上往下执行,id
为NULL
最后执行。
2.2 select_type
select_type
表示对应行是简单的还是复杂的查询。常见的值有:
-
simple
:简单查询,查询不包含子查询和union。 -
primary
:复杂查询中最外层的 select 。 -
subquery
:包含在 select 中的子查询(不在 from 子句中) -
derived
:包含在 form 子句中的子查询,MySQL 会将结果放在一个临时表中,也称为派生表。 -
union
:在 union 中的第二个或之后的 select。
【注】在 MySQL 5.7
中,会对衍生表进行合并优化,如果要直观的查看 select_type
的值,需要临时关闭该功能(默认是打开的),下面的介绍中凡是涉及到衍生表的都需要该操作。
# 关闭衍生表的合并优化(只对该会话有效)set session optimizer_switch='derived_merge=off'; # 打开衍生表的合并优化(只对该会话有效)set session optimizer_switch='derived_merge=on';
2.3 table
对应行查询的表。
【注】
- 本文来源[email protected]搞@^&代*@码网(当
from 子句
中有子查询时,table 列为是<derivenN>
的格式,表示这一行的执行的是id = N
行的查询。 - 当有
union
时,table 的数据为<union M,N>
的格式,M 和 N
表示参与union
的select
行id
。
2.4 partitions
未完待续。。。
2.5 type(非常重要)
type
表示这行查询的关联类型(访问类型,或查询类型),通过该值可以了解该行查询数据记录的大概范围。- 常见的值依次从最优到最差分别为:
system > const > eq_ref > ref > range > index > ALL
;一般我们要保证效率的话,要优化我们的语句至少使其达到range
级别,如果可能的话做好优化到ref
;range
一般用于范围查找,所以换句话说除了范围查找,其他的查询语句我们最好是优化到ref
级别。