MySQL如何使用explain分析SQL的执行计划

一、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越大,越先执行。

  2. 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)
  3. table
    输出行所引用的表的名称。或者连表名称。

  4. partitions
    查询将从中匹配记录的分区。

  5. 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 对来自先前表的行的每个组合进行全表扫描。
  6. possible_keys
    显示可能应用在这张表中的索引。如果是空,没有可能的索引。

  7. key
    实际应用到这张表的索引,如果是null,则没有索引使用。

  8. key_len
    使用的索引的长度,在不损失精度的情况下,长度越短越好。

  9. ref
    显示索引的拿一列被使用了。如果可能的话,是一个常数。

  10. row
    MySQL认为必须检查的用来返回请求数据的行数。

猜你喜欢

转载自blog.csdn.net/u013866352/article/details/107861788