一、explain简介

explain是MySQL一款查看SQL语句的执行计划的命令,使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。帮助分析你的查询语句或是表结构的性能瓶颈。

官方解释:
该EXPLAIN语句提供有关MySQL如何执行语句的信息。
EXPLAIN为SELECT语句中使用的每个表返回一行信息 。它按照MySQL在处理语句时读取它们的顺序列出了输出中的表。这意味着MySQL从第一个表中读取一行,然后在第二个表中然后在第三个表中找到匹配的行,依此类推。处理完所有表后,MySQL将通过表列表输出选定的列和回溯,直到找到一个表,其中存在更多匹配的行。从该表中读取下一行,然后继续下一个表。

详细资料请参加官方文档

二、用法

EXPLAIN [sql语句]

示例:

mysql> explain select count(*) from tb_orders;
+----+-------------+-----------+------------+-------+---------------+--------------------------+---------+------+------+----------+-------------+
| id | select_type | table     | partitions | type  | possible_keys | key                      | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-----------+------------+-------+---------------+--------------------------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | tb_orders | NULL       | index | NULL          | tb_orders_trade_id_index | 258     | NULL |  873 |   100.00 | Using index |
+----+-------------+-----------+------------+-------+---------------+--------------------------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

各个字段的含义如下:

字段名称

JSON名称

含义

id

select_id

该SELECT标识符

select_type

没有

该SELECT类型

table

table_name

输出行表

partitions

partitions

匹配的分区

type

access_type

联接类型

possible_keys

possible_keys

可能的索引选择

key

key

实际选择的索引

key_len

key_length

所选键的长度

ref

ref

与索引比较的列

rows

rows

估计要检查的行

filtered

filtered

按表条件过滤的行百分比

Extra

没有

附加信息

三、各个字段的含义

  1. id
    id是执行顺序的标识。

相同id的执行顺序自上而下。
不同id时候,id越大,越先执行。

  1. select_type
    查询的类型,可以是下表中显示的任何类型。

select_type

含义

SIMPLE

简单SELECT(不使用 UNION或子查询)

PRIMARY

最外层 SELECT

UNION

SELECT陈述中的第二个或之后的陈述 UNION

DEPENDENT UNION

UNION中的第二个或更高版本的SELECT语句,取决于外部查询

UNION RESULT

UNION的结果。

SUBQUERY

首先SELECT在子查询

DEPENDENT SUBQUERY

首先SELECT在子查询中,取决于外部查询

DERIVED

没有 派生表

DEPENDENT DERIVED

派生表依赖于另一个表

MATERIALIZED

物化子查询

UNCACHEABLE SUBQUERY

子查询,其结果无法缓存,必须针对外部查询的每一行重新进行评估

UNCACHEABLE UNION

UNION 属于不可缓存子查询的中的第二个或更高版本的选择(请参阅参考资料 UNCACHEABLE SUBQUERY)

  1. table
    输出行所引用的表的名称。或者连表名称。
  2. partitions
    查询将从中匹配记录的分区。
  3. type
    联接类型。
    这是重要的列,显示连接使用了何种类型,从最好到最差的连接类型一次是:
    const、eq_reg、ref、range、index和 ALL。
    详情参见 EXPLAIN 连接类型

类型

说明

system

该表只有一行(=系统表)。这是const联接类型的特例 。

const

该表最多具有一个匹配行,该行在查询开始时读取。因为只有一行,所以优化器的其余部分可以将这一行中列的值视为常量。 const表非常快,因为它们只能读取一次。

eq_ref

对于先前表中的每行组合,从此表中读取一行。除了 system和 const类型,这是最好的联接类型。

ref

对于先前表中的每个行组合,将从该表中读取具有匹配索引值的所有行。

fulltext

使用FULLTEXT 索引执行联接。

ref_or_null

这种连接类型类似于 ref,但是除了MySQL会额外搜索包含NULL值的行。

index_merge

此联接类型指示使用索引合并优化。

unique_subquery

此类型替换某些eq_ref的IN子查询

index_subquery

此连接类型类似于 unique_subquery。

range

使用索引选择行,仅检索给定范围内的行。

ALL

对来自先前表的行的每个组合进行全表扫描。

  1. possible_keys
    显示可能应用在这张表中的索引。如果是空,没有可能的索引。
  2. key
    实际应用到这张表的索引,如果是null,则没有索引使用。
  3. key_len
    使用的索引的长度,在不损失精度的情况下,长度越短越好。
  4. ref
    显示索引的拿一列被使用了。如果可能的话,是一个常数。
  5. row
    MySQL认为必须检查的用来返回请求数据的行数。