explain用法
mysql中explain有两种用法,一种是explain table_name用来查看表结构信息,另一种就是explain select....用来查询sql执行计划,分析sql性能。
- 查看表结构
- 查询sql执行计划
其中查看表结构没什么复杂内容,在此不过多介绍,下面主要介绍查询sql执行计划的功能。
查询sql执行计划结果说明
关于explain的官方文档地址(5.7版本的):https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
可以看出执行explain查询的结果如下:
id
官方说明
select查询的序列号,这个序列号标识select执行的优先级,序号越大,优先级越高,序号相同,则优先级相同。当查询关联到union结果集时,id允许为null。
比如表连接查询的时候优先级是相同的:
对于含有子查询的sql,子查询的优先级是高于外层查询的,因此子查询的id号大于外层查询的id号。如下:
当id为null时,表示这是一个union结果集,不需要用它来查询
select_type
官方说明:
查询的类型,取值可以是SIMPLE、PRIMARY、UNION、DEPENDENT UNION、UNION RESULT、SUBQUERY、DEPENDENT SUBQUERY、DERIVED、MATERIALIZED、UNCACHEABLE SUBQUERY、UNCACHEABLE UNION。
下面介绍几个经常会见到的:
SIMPLE:字面意义上理解是简单的查询,没有用到UNION 或子查询。如:
PRIMARY:复杂sql中最外层的查询,
SUBQUERY:子查询,如下:
UNION:UNION 中的第二个或以后的 SELECT 语句,下图中report_attr为union后的(即union中的第二个),select_type显示为UNION。
UNION RESULT:UNION的结果集,如下图中第三行为id为2和id为3的结果集UNION后的结果集
DERIVED:衍生表,即查询过程中生成的临时结果集。
table
官方说明
所引用的表名称,当为衍生表时,值为<derived+衍生表id>,如:<derived2>;当为联合结果集时值为<union+union第一个表id,union第二个表id>,如:<union2,3>
partitions
这个字段是关于分区表的分区记录,很少用到,在此不再说明,感兴趣可以去官网了解。
type
这个字段是比较重要的,主要取值如下:system, const, eq_ref, ref, range, index, ALL
性能从左到右越来越低system > const > eq_ref > ref > range > index > ALL
- system
这是 const 连接类型的一个特例。当表数据只有一条时连接类型为system
- const
该表最多有一个匹配行,在查询开始时读取。 因为只有一行,所以这一行中列的值可以被优化器的其余部分视为常量。 const 表非常快,因为它们只被读取一次。
当您将 PRIMARY KEY 或 UNIQUE 索引的所有部分与常量值进行比较时,将使用 const。
也就是说当查询的结果集只有一行时会采用const连接,比如当用主键作为条件查询或者用不重复索引作为条件是将用const
- eq_ref
当表连接查询时,用到某个表的主键索引或其他唯一索引作为条件时,将会用ep_ref的连接方式,除了 system 和 const 类型之外,这是最好的连接类型。
- ref
当使用的条件不是主键索引或者唯一索引,而是普通索引时,连接方式是ref,也就是说该条件可能会匹配多行而不是一行时用到ref
- range
当在索引字段上加范围条件是用到range连接。
当使用 =、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN、LIKE 或 IN() 运算符中的任何一个将键列与常量进行比较时,可以使用范围
- index
索引连接类型与 ALL 相同,只是扫描索引树。 这有两种方式:
如果索引是查询的覆盖索引并且可以用于满足表中所需的所有数据,则仅扫描索引树。 在这种情况下,Extra 列显示使用索引。 仅索引扫描通常比 ALL 快,因为索引的大小通常小于表数据。
使用从索引中读取以按索引顺序查找数据行来执行全表扫描。 使用索引不会出现在 Extra 列中。
当查询仅使用属于单个索引的列时,MySQL 可以使用此连接类型。
也就是说当查询的结果在索引树中都存在的话不需要全表扫描,效率会比ALL快些,Extra列中显示Using index。
如果语句中有ALL,需要考虑优化。
- ALL
全表扫描,效率最低,如果出现这个字段,需要考虑优化。
一般情况下,查询语句要控制type在range,如果效率低于这个,则要考虑优化。
标签:const,UNION,explain,查询,索引,详解,ref From: https://www.cnblogs.com/yashuadiula/p/16626507.html