- 执行计划可以帮助我们看到sql查询的具体过程,我们可以根据此过程评估该sql的执行效率。
- 语法
EXPLAIN <DQL>
- 字段分析
-
id
- select查询的序列号,标识执行的顺序
- ID相同,执行顺序由上至下
- id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
- select查询的序列号,标识执行的顺序
-
select_type
- SIMPLE
- 简单的select查询,查询中不包含子查询或者union
`案例` EXPLAIN SELECT * FROM emp WHERE deptno = 30
- 简单的select查询,查询中不包含子查询或者union
- PRIMARY
- 查询中包含子部分,最外层查询则被标记为primary
`案例` EXPLAIN SELECT * FROM emp WHERE deptno = (SELECT deptno FROM dept WHERE dname='SALES') ; 描述 EXPLAIN SELECT * FROM emp WHERE deptno = () ; select_type 为 primary
- SUBQUERY/MATERIALIZED
- SUBQUERY
- 表示select 或 where 列表 中包含了子查询
案例 EXPLAIN SELECT * FROM emp WHERE deptno = (SELECT deptno FROM dept WHERE dname='SALES') ; 描述 (SELECT deptno FROM dept WHERE dname='SALES')内是一个子查询 ,而此查询 select_type = SUBQUERY 注意 where条件中使用 in 不是子查询 而是普通查询
- MATERIALIZED(where 后面 in 条件的子查询)
- SUBQUERY
- UNION(union 中第二个或后面的select 语句)
- UNION RESULT
- SIMPLE
-
table( 查询涉及到的表)
- 直接显示表名或者表的别名
- <union M,N> 由 ID 为 M,N 查询 union 产生的结果
- <subqueryN> 由ID为N 查询产生的结果
-
type
- 访问类型,SQL查询优化中一个很重要的指标,结果值从好到坏依次是 system > const > eq_ref > ref > range > index > All
- 值
-
system
1. 系统表,少量数据,往往不需要进行磁盘IO- 特点:
从系统库MYSQL的系统里查询数据,访问类型为 system ,这些数据已经加载到内存中
不需要磁盘IO,这类扫描速度是最快的
- 特点:
-
const(常量连接)
- 特点
命中主键(primary key) 或者唯一 (unique)索引被连接的部分是一个常量(const)值 - 列子
命中主键
命中唯一
- 特点
-
eq_ref
- 主键索引(primary key )或者 非空唯一索引(unique not null)等值扫描
- 特点
join 查询 - 列子
命中主键 (primary key)索引 一对一等值连接
非空唯一 (unique not null)索引 一对一等值连接
-
ref
- 非主键非唯一索引等值扫描
- 特点
一对多等值连接,由eq_req 降级为 ref
-
range(范围扫描)
- 特点
索引上的范围查询,他会在索引上扫码特定范围内的值
between 、in 、>、<、>=、<=都是典型的范围(range)查询 - 例子
命中主键
- 特点
-
index(索引树扫描)
- 特点
需要通过扫描 索引上的全部数据 来获取结果,他仅比全表扫描快一点 - 例子
全表查询
- 特点
-
ALL全表扫描(full table scan )
- 特点
需要通过扫描非索引上的全部数据来获取结果 - 例子
全表直接查询
查询不是索引的字段
- 特点
-
-
possible_keys
- 查询过程中有可能使用到的索引
-
key
- 实际使用的索引,如果为 null ,则没有使用索引
-
row
- 根据表统计信息或者索引选用情况,大致估算处找到所需记录所需要读取的行数, 越小越好
-
filtered
- 表示返回结果的行数 占读取行数的百分比, filtered 的值越大越好
-
extra
- Using filesort
MYSQL 对数据使用一个外部的文件内容进行了排序,而不是按照表内的索引进行排序读取 - Using temporary
使用临时表保存中间结果,也就是说 mysql在对查询结果排序时使用了临时表,常见于 order by 或者 group by - Using index
表示 SQL操作中使用了覆盖索引(Covering index), 避免了访问表的数据行,效率高 - Using index condition
表示SQL 操作命中了索引,但不是所有的列数据都在索引树上,还需要访问实际的行记录。 - Using where
表示SQL操作使用了 where过滤条件 - select tables optimized away
基于索引优化 MIN/MAX操作 或者MyISAM存储引擎优化count(*)操作,不必等到执行阶段在井陉计算,查询执行计划生成的阶段即可完成优化 - Using join buffer(Block Nested Loop)
表示SQL操作使用了关联查询或者 子查询,且需要进行嵌套循环计算
- Using filesort
-
mysql-执行计划
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...