MYSQL EXPLAIN 执行计划详解

时间:2021-12-20 03:54:40

explain的作用:

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

EXPLAIN SELECT
    (
        SELECT
            c. NAME
        FROM
            fx_channel c
        WHERE
            c.id = s.channel_id
    ) ,
    SUM(s.total_cost) ,
    SUM(s.total_count) ,
    SUM(s.success_count)
FROM
    fx_analysis_channel_source s
WHERE
    statistic_time >= '2017-01-20'
AND statistic_time < '2018-01-20'
GROUP BY
    s.channel_id
HAVING
    SUM(s.total_count) > 0
ORDER BY
    SUM(s.total_cost) DESC

 

1. id

SELECT识别符。这是SELECT查询序列号。查询序号即为sql语句执行的顺序。当id相同时,执行顺序从上而下依次执行。
当ID 不同时,id的值越大,越优先执行。当id值有相同又有不同时,先是执行id值大的语句,然后在相同id中,从上而下依次执行。

 

2.select_type

表示查询类型。

类型 描述
 simple  简单查询
 primary  最外面的select(鸡蛋壳)
 union  union语句的第二个或者说是后面那一个
 subquery  在select或where列表中包含了子查询
 derived  在FROM列表中包含的子查询被标记为derived(衍生)MySQL会递归执行这些子查询,把结果放在临时表中
 dependent union  UNION中的第二个或后面的SELECT语句,取决于外面的查询
 union result  UNION的结果


3.table

查询时所用的表。

 

4.type

连接类型。有多个参数,先从最佳类型到最差类型介绍 重要且困难

类型 描述
 system (最佳)  表仅有一行,这是const类型的特列,平时不会出现,这个也可以忽略不计
 const(次之)  表最多有一个匹配行,const用于比较primary key 或者unique索引。因为只匹配一行数据,所以很快。
 eq_ref(次之)  唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
 ref  非唯一性索引扫描,返回匹配某个单独值得所有行,本质上也是一种索引访问,它范湖所有匹配某个单独值得行,然而,他可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。
 range(次之)  只检索给定返回的行,使用一个索引来选择行,key列显示使用了哪个索引,一般就是在你的where语句中出现了between、<、>、in等的查询。这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某个点,而结束于另一给点,不用扫描全部索引。
 index(次之)  该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)当查询只使用作为单索引一部分的列时,MySQL可以使用该联接类型。
 ALL(最差)  对于每个来自于先前的表的行组合,进行完整的表扫描。如果表是第一个没标记const的表,这通常不好,并且通常在它情况下很差。通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常数值或列值被检索。

 

5.possible_keys

显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段若存在索引,则该索引将被列出。但不一定被查询实际使用。

 

6.keys

MYSQL实际使用的索引.如果为NULL,则没有使用索引。查询中若使用了覆盖索引,则该索引和查询的select字段重叠。

 

7.key_len

MYSQL使用的索引长度。
在不损失精确性的情况下,长度越短越好

 

8.ref

显示索引的那一列被使用了。如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值

 

9.rows

显示MYSQL执行查询的行数,一般情况下,越小越好

 

10.Extra

该列包含MySQL解决查询的详细信息。

类型 描述
 Distinct  MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
 range checked for each record  没有找到合适的索引
 using filesort  文件排序,说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引进行读取。
 using index  是否使用了索引
 using temporary  表示使用了临时表,如果出现这个,则必须优化。
 using where  表示使用了条件查询
 Using sort_union(…), Using union(…),Using intersect(…)  说明如何为index_merge联接类型合并索引扫描
 Using index for group-by  类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。并且,按最有效的方式使用索引,以便对于每个组,只读取少量索引条目。

通过相乘EXPLAIN输出的rows列的所有值,你能得到一个关于一个联接如何的提示。这应该粗略地告诉你MySQL必须检查多少行以执行查询。当你使用max_join_size变量限制查询时,也用这个乘积来确定执行哪个多表SELECT语句。