一、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认为必须检查的用来返回请求数据的行数。