MySQL优化性能之explain详细介绍

MySQL高级语法——Explain简介

一、概述

​ Mysql所提供的explain关键词是用于调优排患的一个神器,通过它可以分析查询语句的执行情况,DBA可以通过分析语句的执行结果对查询语句甚至表结构进行优化,例如添加索引,修改索引,使用覆盖索引等等。

二、基本结构介绍

id

​ id是为select 的序列号,如果有多个select,那么将有多个id,并且id的顺序将根据select出现的顺序而增加。MySQL将select查询分为简单查询和复杂查询。复杂查询分为三类:简单子查询、派生表(from语句中的子查询)和联合查询。


select_type

​ select_type 表示为查询的类型,其中分为了如下几种类型:

  • SIMPLE(简单SELECT,没有实用UNION或子查询等其他)
EXPLAIN SELECT * FROM emp WHERE sal>'20000';

在这里插入图片描述

  • PRIMARY(查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
  • DERIVED( 位于FROM后的的子查询,也称为派生表的SELECT)
EXPLAIN SELECT
z.*,d.dname,d.loc
FROM dept d, (SELECT deptno, COUNT(*) cnt FROM emp GROUP BY deptno) z
WHERE z.deptno=d.deptno;

在这里插入图片描述

  • UNION(UNION中出现的第二个SELECT语句)

  • UNION RESULT(UNION的结果),从 union 临时表检索结果的 select

  • SUBQUERY 它是子查询中的出现的第一个SELECT,它是不在from后的子查询

EXPLAIN
SELECT *
FROM emp e
WHERE e.sal > (SELECT sal FROM emp WHERE ename='关羽')
UNION
SELECT *
FROM emp e
WHERE e.sal > (SELECT sal FROM emp WHERE ename='关羽');

在这里插入图片描述

table

​ 表示对哪个表进行的查询,有时候可能不是真实存在的表名字,例如:当 from 子句中有子查询时,table列是 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查询。当有 union 时,UNION RESULT 的 table 列的值为 <union1,2>,1和2表示参与 union 的 select 行id。

partitions

​ 表示在哪个分区使用

type

​ 表示查询的方式或访问类型,常用的访问类型有:

system > const > eq_ref > ref > fulltext > index_merge > unique_subquery > index_subquery > range > index > all (依次表示查询类型的性能排序,从优到差)

ALL: 对全表数据进行查询遍历

index: 它通过表中索引进行查询,通常比ALL快很多

range: 使用一个索引来选择行,范围扫描通常出现在 in(), between ,> ,<, >= 等操作中。

在这里插入图片描述

表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

eq_ref: 简单来说,就是多表连接中使用primary key或者 unique key作为关联条件,多表之间的关联之间可见。

EXPLAIN
SELECT e.empno, e.ename, d.dname
FROM emp e LEFT JOIN emp m 
ON e.mgr=m.empno 
LEFT JOIN dept d ON e.deptno=d.deptno
WHERE e.hiredate<m.hiredate;

在这里插入图片描述

const、system: mysql能对查询的某部分进行优化并将其转化成一个常量,用于 primary key 或 unique key 的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快。

mysql> explain extended select * from (select * from film where id = 1) tmp;

在这里插入图片描述

NULL

在这里插入图片描述

MySQL能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如:在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表

MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

possible_keys

如果查询的表中建立有索引怎可能会被显示到这里,但也不一定被查询使用。(不一定有索引就一定显示索引出来)explain 时可能出现 possible_keys 有列,而 key 显示 NULL 的情况,这种情况是因为表中数据不多,mysql认为索引对此查询帮助不大,选择了全表查询。

key

若没有使用索引,则键是NULL。若想要强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)

不损失精确性的情况下,长度越短越好

ref

这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),func,NULL,字段名(例:film.id)【表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值】

rows

表示是MySQL估计要读取并检测的行数,并不是结果集里的行数。

Extra


Using where: 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤

Using temporary: 表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询

Using filesort: MySQL中无法利用索引完成的排序操作称为“文件排序”

Using join buffer: 改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。

Impossible where: 这个值强调了where语句会导致没有符合条件的行。

Select tables optimized away: 这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行

参考来源:

https://www.cnblogs.com/butterfly100/archive/2018/01/15/8287569.html

https://www.cnblogs.com/xuanzhi201111/p/4175635.html

img

猜你喜欢

转载自blog.csdn.net/weixin_45496190/article/details/106151725
今日推荐