explain命令
2019-02-14 本文已影响0人
阿长_一个程序员
- explain有时会执行查询,如果查询在from子句中包含子查询,mysql实际上会执行子查询,将其结果放在一个临时表中,然后完成外层查询优化。
- explain只是个近似结果
explain中的列
挑些重要的列来说说
select_type列
simple值指查询不包括子查询和union。如果是复杂查询,则最外层标记为primary,其他部分标记如下
- subquery
表示包含在select中的子查询的select
select t_score,(select * from student) from ...
- derived
表示包含在from子句的子查询中的select,mysql会递归执行并将结果放到一个临时表中。
select t1.order, t2.goods_name from (select ...) ...
- union
在union中的第二个和随后的select被标记为union,因为第一个被标记为primary。如果union被from子句中的子查询包含,那么它的第一个select会被标记为derived - union result
用来从union的匿名临时表检索结果的select被标记为union result
table列
这一列显示了对应行正在访问哪个表。
在中国例子中我们可以看到mysql选择的关联顺序不同于语句中所指定的顺序
当from子句有子查询时,table列是<derivedN>的形式,其中N是子查询的id
type列
最重要的列,显示mysql决定如何查找表中的行。下面是最重要的访问方法,性能从最差到最优
- ALL
全表扫描,从头到尾 - index
全表扫描,和ALL不同的是,扫描表时按照索引的次序进行而不是行。
如果在Extra列中看到“Using index”,说明mysql在使用覆盖索引,性能极佳 - range
范围扫描,带有between或在where中带有 > 等的查询。
注意,IN()和OR()也会显示为range,但他们和上面的是不同的访问类型。 - ref
这是一种索引访问,此类索引访问只有当使用非唯一性索引或者唯一性索引的非唯一前缀时才会发生。 - eq_ref
使用这种索引查找,MYSQL知道最多只返回一条符合条件的记录。此类型通常出现在多表的 join 查询, 表示对于前表的每一个结果, 都只能匹配到后表的一行结果. 并且查询的比较操作通常是 =, 查询效率较高 - const, system
针对主键或唯一索引的等值查询扫描, 最多只返回一行数据. const 查询速度非常快, 因为它仅仅读取一次即可
例如:select * from user_info where id = 2
image.png
image.png
image.png
image.png
image.png