亲测!教你查看mysql语句的执行计划explain

一、话不多说,先看官网地址

https://dev.mysql.com/doc/refman/5.6/en/explain-output.html

二、进入正题

2.1 什么是explain

我们使用explain命令来查看mysql语句的执行计划(execution plan),解释mysql是如何执行一条sql语句的;解释的内容主要包括表的连接方式和顺序,以及索引的使用情况。使用explain,可以分析出需要在哪里加上索引,以及调整表的连接,以达到优化查询的目的;explain命令之后不仅可以跟select语句,也可以跟delete,insert,update,replace语句。

2.2 执行explain

EXPLAIN SELECT * FROM zipkin_annotations WHERE endpoint_service_name = "pids-fastdfs"

+----+-------------+--------------------+------------+------+-----------------------+-----------------------+---------+-------+------+----------+-------+
| id | select_type | table                       | partitions  | type | possible_keys                | key                                 | key_len | ref   | rows | filtered    | Extra |
+----+-------------+--------------------+------------+------+-----------------------+-----------------------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | zipkin_annotations | NULL       | ref   | endpoint_service_name | endpoint_service_name | 768     | const | 1146 |   100.00 | NULL  |
+----+-------------+--------------------+------------+------+-----------------------+-----------------------+---------+-------+------+----------+-------+
1 row in set (0.03 sec)

id

id是用来顺序标识整个查询中SELELCT 语句的,在嵌套查询中id越大的语句越先执行。该值可能为NULL,如果这一行用来说明的是其他行的联合结果。

select_type

表示查询的类型

在这里插入图片描述

table

对应行正在访问哪一个表,表名或者别名

关联优化器会为查询选择关联顺序,左侧深度优先
当from中有子查询的时候,表名是derivedN的形式,N指向子查询,也就是explain结果中的下一列
当有union result的时候,表名是union 1,2等的形式,1,2表示参与union的query id
注意:MySQL对待这些表和普通表一样,但是这些“临时表”是没有任何索引的。

type

type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL ,一般来说,得保证查询至少达到range级别,***能达到ref。

说明联接类型

该type列 EXPLAIN输出介绍如何联接表。在JSON格式的输出中,这些作为access_type属性的值找到。以下列表描述了连接类型,从最佳类型到最差类型:

联接类型 说明
system 该表只有一行(=系统表)。这是const联接类型的特例 。
const 该表最多具有一个匹配行,该行在查询开始时读取。因为只有一行,所以优化器的其余部分可以将这一行中列的值视为常量。 const表非常快,因为它们只能读取一次。
eq_ref 对于先前表中的每行组合,从此表中读取一行。除了 system和 const类型,这是最好的联接类型。当连接使用索引的所有部分且索引为a PRIMARY KEY或UNIQUE NOT NULLindex时使用。
ref 对于先前表中的行的每种组合,将从该表中读取具有匹配索引值的所有行。ref如果联接仅使用键的最左前缀,或者如果键不是a PRIMARY KEY或 UNIQUE索引(换句话说,如果联接无法根据键值选择单个行),则使用。如果使用的键仅匹配
fulltext 使用FULLTEXT 索引执行联接。几行,则这是一种很好的联接类型。
ref_or_null 这种连接类型类似于 ref,但是除了MySQL还会额外搜索包含NULL值的行。此联接类型优化最常用于解析子查询。在以下示例中,MySQL可以使用 ref_or_null联接进行处理ref_table:
index_merge 此联接类型指示使用索引合并优化。在这种情况下,key输出行中的列包含使用的索引列表,并key_len包含使用的索引 的最长键部分的列表
unique_subquery 此类型替换 以下形式的eq_ref某些 IN子查询:
index_subquery 此连接类型类似于 unique_subquery。它替代IN子查询,但适用于以下形式的子查询中的非唯一索引:
range 使用索引选择行,仅检索给定范围内的行。的key 输出行中的列指示使用哪个索引。将key_len包含已使用的时间最长的关键部分。该ref列 NULL适用于此类型。
index 该index联接类型是一样的 ALL,只是索引树被扫描。这发生两种方式:
ALL 对来自先前表的行的每个组合进行全表扫描。如果该表是未标记的第一个表 const,则通常不好,并且在所有其他情况下通常 非常糟糕。通常,可以ALL通过添加索引来避免这种情况,这些 索引允许基于早期表中的常量值或列值从表中检索行。

possible_keys

显示查询使用了哪些索引,表示该索引可以进行高效地查找,但是列出来的索引对于后续优化过程可能是没有用的

key

key列显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

key_len

key_len列显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好 。

ref

ref列显示使用哪个列或常数与key一起从表中选择行。

rows

rows列显示MySQL认为它执行查询时必须检查的行数。注意这是一个预估值。

Extra

Extra是EXPLAIN输出中另外一个很重要的列,该列显示MySQL在查询过程中的一些详细信息,MySQL查询优化器执行查询的过程中对查询计划的重要补充信息。

猜你喜欢

转载自blog.csdn.net/qq_34168515/article/details/108073480