一、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 | 没有 | 附加信息 |
三、各个字段的含义
- id
id是执行顺序的标识。
相同id的执行顺序自上而下。
不同id时候,id越大,越先执行。
- 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) |
- table
输出行所引用的表的名称。或者连表名称。 - partitions
查询将从中匹配记录的分区。 - 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 | 对来自先前表的行的每个组合进行全表扫描。 |
- possible_keys
显示可能应用在这张表中的索引。如果是空,没有可能的索引。 - key
实际应用到这张表的索引,如果是null,则没有索引使用。 - key_len
使用的索引的长度,在不损失精度的情况下,长度越短越好。 - ref
显示索引的拿一列被使用了。如果可能的话,是一个常数。 - row
MySQL认为必须检查的用来返回请求数据的行数。
















