mysql explain ref const_MySQL EXPLAIN 详解

一 .介绍

EXPLAIN 命令用于SQL语句的查询执行计划。这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的。这条命令并没有提供任何调整建议,但它能够提供重要的信息帮助你做出调优决策。

先解析一条sql语句,你可以看出现什么内容

EXPLAIN SELECT * FROM person,dept WHERE person.dept_id = dept.did and person.salary >20000

2f1ba78d8615e3232cb34eb39a66c8f6.png

下面咱们详细的介绍一下 查询计划的结果列:

二. id : 查询序列号

查询序号即为sql语句执行顺序

EXPLAIN select * from person where dept_id =(select did from dept where dname ='python');

2ad630790fa9d76f7c9424dc80c2f51e.png

从 2 个表中查询,对应输出 2 行,每行对应一个表, id 列表示执行顺序,id 越大,越先执行,id 相同时,由上至下执行。

三.select_type :查询类型

select_type 列提供了 对表的查询类型。最常见的值包括SIMPLE、PRIMARY、DERIVED 和UNION。其他可能的值还有 UNION RESULT、SUBQUERY 等等.

2.1  simple 简单查询 (没有union和子查询)

对于不包含子查询和其他复杂语法的简单查询,这是一个常见的类型。

EXPLAIN SELECT * FROM person;

238252f61e77378c6737919d2e1eee8c.png

2.2 primary  最外层查询 (在存在子查询的语句中,最外面的select查询就是primary)

这是为更复杂的查询而创建的首要表(也就是最外层的表)。这个类型通常可以在DERIVED 和 UNION 类型混合使用时见到。

2.3 derived   子查询(在FROM列表中包含的子查询)

当一个表不是一个物理表时,那么这个就被叫做DERIVED

EXPLAIN SELECT *FROM (SELECT* FROM person LIMIT 5) AS s

3a2d4b799f7d53f761b0e34795bc3d45.png

2.4 subquery   映射为子查询(在SELECT或WHERE列表中包含了子查询)

这个select-type 的值是为使用子查询而定义的.

EXPLAIN SELECT person.*,(select 2 from person as p2) FROM person where dept_id = (select did from dept where dname='python');

414753fbb7ae4228a067cb873c0f6e56.png

2.5  union 联合

EXPLAIN SELECT * FROM personunion allselect * from person ;

2d9e0016e8cd65be24410eba2e74d439.png

2.6  union result  使用联合的结果

EXPLAIN SELECT * FROM personunion select * from person ;

4b6196fd073d877f31df29a0884bbc05.png

四. table 输出的行所用的表

EXPLAIN SELECT * FROM person;

212c0fbd37858181c30576a66600120e.png

注意: table 列是EXPLAIN 命令输出结果中的一个单独行的唯一标识符。这个值可能是表名、表的别名或者一个为查询产生临时表的标识符,如派生表、子查询或集合。

五. type连接类型

type 列代表表示 查询计划的连接类型, 有多个参数,先从最佳类型到最差类型介绍 重要且困难

性能: null > system/const > eq_ref > ref > ref_or_null  >index_merge >  range > index >  all

4.1 type=NULL 在优化过程中就已得到结果,不用再访问表或索引。

EXPLAIN SELECT max(id) FROM person;

74225c0fa586c417e7b9251ea4148f19.png

4.2 type=const/system 常量

在整个查询过程中这个表最多只会有一条匹配的行,比如主键 id=1 就肯定只有一行;

表最多有一个匹配行,const用于比较primary key 或者unique索引。因为只匹配一行数据,所以一定是用到primary key 或者unique 情况下才会是const,看下面这条语句

EXPLAIN SELECT * FROM person where id =2;

2d0c017ce9a79b79eb5b7948e5510162.png

所以说可以理解为const是最优化的。

4.3 type=eq_ref  使用有唯一性 索引查找(主键或唯一性索引)

对于eq_ref的解释,

你可能感兴趣的:(mysql,explain,ref,const)