MySQL学习----explain查看一条sql 的性能

MySQL 中的 Explain 使用

前言

在开发的过程中,对于我们写的sql语句,我们有时候会考虑sql语句的性能,那么explain就是首选。Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。

Explain语法:explain select … from … [where ...]

分析

例如:explain select * from news;

输出:

+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+

下面对各个属性进行了解:

1、id

实际上每次 select 查询都会对应一个 id,它代表着 SQL 执行的顺序,如果 id 值越大,说明对应的 SQL 语句执行的优先级越高。在一些复杂的查询 SQL 语句中常常包含一些子查询,那么id序号就会递增,如果出现嵌套查询,我们可以发现最里层的查询对应的 id 最大,因此也优先被执行。

2、select_type

select_type 表示执行的计划对应的查询时什么类型。

会有下面几种类型:

1、SIMPLE: 简单的 select 查询,不包含子查询或者UNION查询;

2、PRIMARY: 查询中包含子查询,最为层查询被标记为 PRIMARY;

3、SUBQUERY:在 select 或 where 列表中包含了子查询,该子查询被标记为 SUBQUERY;

4、UNION: UNION 之后出现的 select 语句对应的查询类型会标记此类型;

5、UNION RESULT: UNION 的结果;

6、SUBQUERY: 子查询中的第一个 select;

7、DEPENDENT SUBQUERY: 子查询中的第一个 select,取决于外面的查询。

3、table

table 表示表名称,表示要查询哪张表,不一样是真实的表,可能是表的别名或者临时表。

4、type

这列最重要,显示了连接使用了哪种类别,有无使用索引,是使用 Explain 命令分析性能瓶颈的关键项之一。

type 字段可能的值

  • system: 表示只有一行记录(等于系统表),这是 const 类型的特列,基本上不太会遇到,可忽略;

  • const: 表中只有一行数据数据被匹配,代表该查询使用主键或者唯一键进行查询,可以直接返回需要查询的记录,效率最高;

  • eq_ref: 类似 ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用 primary key 或者 unique key 作为关联条件;

  • ref: 使用非唯一索引扫描或者唯一索引的前缀扫描,返回匹配某个单独值的记录行;

  • index: 对索引列进行全索引扫描,这种就需要优化了;

  • all: 对整张表进行全表扫描,这是最糟糕的情况。

type 值的评判标准,结果值从好到坏依次是

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,得保证查询至少达到 range 级别,最好能达到 ref,否则就可能会出现性能问题。

5、possible_keys

指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用。

6、key

显示 MySQL 实际决定使用的键(索引)。如果没有选择索引,键是 NULL。

7、key_len

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

8、ref

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

9、rows

显示 MySQL 认为它执行查询时必须检查的行数。

10、Extra

包含 MySQL 解决查询的详细信息,也是关键参考项之一。

1、Using index

该值表示在进行数据查询的时候使用了覆盖索引,而不用进行回表的查询了。

索引确实能够提高查询的效率,但二级索引会有某些情况会存在二次查询也就是回表的问题,这种情况合理的使用覆盖索引,能够提高索引的效率,减少回表的查询。

覆盖索引将需要查询的值建立联合索引,这样索引中就能包含查询的值,这样查询如果只查询 索引中的值和主键值 就不用进行二次查询了,因为当前索引中的信息已经能够满足当前查询值的请求。

2、Using where

表示查询的时候未找到可用的索引,需要通过 where 条件过滤所需要的的数据,但要注意的是并不是所有带 where 语句的查询都会显示 Using where

Using where 的作用只是提醒我们 MySQL 将用 where 子句来过滤结果集。这个一般发生在 MySQL 服务器,而不是存储引擎层。一般发生在不能走索引扫描的情况下或者走索引扫描,但是有些查询条件不在索引当中的情况下。

3、Using temporary

表示 MySQL 需要使用临时表来存储结果集,常见于排序和分组查询。

这个值表示使用了内部的临时表,一个查询可能会用到多个临时表,有很多原因都会导致MySQL在执行查询期间创建临时表。两个常见的原因是在来自不同表的上使用了DISTINCT,或者使用了不同的 ORDER BY和 GROUP BY 列。

4、Using filesort

表示查询后结果需要使用临时表来存储,一般在排序或者分组查询时用到。

5、 Using join buffer

改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。

6、Using Index Condition

MySQL 5.6 版本后加入的新特性(Index Condition Pushdown),索引下推,主要是用来通过减少回表的次数,提高查询的性能。简单点讲就是在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

Using index condition 的出现,意味着 MySQL 在执行这条语句时使用了Index Condition Pushdown(ICP)。

总结

面对一些慢查询,通过 Explain 能够帮助我们分析出一些性能的瓶颈。

posted on 2018-10-21 11:20  ZhanLi  阅读(1518)  评论(0编辑  收藏  举报