MySQL的EXPLAIN命令详解(背就完事了)

文章目录

    • 语法
    • 各列详解
      • key
      • rows
      • possible_keys
      • key_len
      • table
      • select_type
        • simple
        • primary
        • derived
        • dependent subquery
        • union
        • union result
      • partitions
      • Extra
        • using where
        • using temporary
        • using filesort
        • Using index
        • using join buffer
        • Impossible where
        • select tables optimized away
        • Distinct![在这里插入图片描述](https://img-blog.csdnimg.cn/2019101313594863.png)
        • index merges
      • id
      • ref
      • filtered
      • type
    • 解释EXPLAIN输出结果

MySQL的EXPLAIN命令用于 SQL语句的查询执行计划(QEP).
这条命令的输出结果能够让我们了解MYSQL优化器是如何执行SQL语句的。

语法

QEP是通过EXPLAIN命令生成的,它的语法包含两项:
MySQL的EXPLAIN命令详解(背就完事了)_第1张图片
EXPLAIN如果作用在表上,那么此命令等同于DESC表命令。
UPDATE和DELETE如果要优化则需要把它们改写成SELECT语句然后执行EXPLAIN.
MySQL的EXPLAIN命令详解(背就完事了)_第2张图片
这个UPDATE语句可以被重写成下面的SELECT语句:
MySQL的EXPLAIN命令详解(背就完事了)_第3张图片
存储过程缓存仅仅解析查询数。MySQL优化器是基于开销来工作的,它不提供任何QEP(查询执行计划)的位置。

各列详解

MySQL EXPLAIN命令能够为sql语句中的每一个表生成以下信息:
MySQL的EXPLAIN命令详解(背就完事了)_第4张图片
这个QEP(查询执行计划)显示没有使用任何索引并且处理了大量的行来满足查询。
对同样一条select语句,一个优化过的QEP如下:
MySQL的EXPLAIN命令详解(背就完事了)_第5张图片MySQL的EXPLAIN命令详解(背就完事了)_第6张图片
在这个QEP中我们看到它使用了一个索引,且只有一行数据被获取。

QEP中每行的所有列表如下:

  • id
  • select_type
  • table
  • partitions(这一列只有通过EXPLAIN PARTITIONS语法才会出现)
  • possible_keys
  • key
  • key_len
  • ref
  • rows
  • filtered(这一列只有在EXPLAINED EXTENDED语法中才会出现)
  • Extra

key

key列指出优化器选择使用的索引。
一般来说SQL查询中的每一个表都仅使用一个索引。
也存在索引合并的少数例外情况,如给定表上用到了两个或者更多索引:
在这里插入图片描述
show create table < table>命令是最简单的查看表和索引列细节的方式。

rows

rows列提供了试图分析所有存在于累计结果集中的行数的MySQL优化器估计值。
查询中总的读操作数量是基于合并之前行的每一行的rows值的连续积累而得出的。这是一种嵌套算法。
MySQL的EXPLAIN命令详解(背就完事了)_第7张图片MySQL的EXPLAIN命令详解(背就完事了)_第8张图片MySQL的EXPLAIN命令详解(背就完事了)_第9张图片MySQL的EXPLAIN命令详解(背就完事了)_第10张图片MySQL的EXPLAIN命令详解(背就完事了)_第11张图片MySQL的EXPLAIN命令详解(背就完事了)_第12张图片

possible_keys

possible_keys列指出优化器为查询选定的索引。
一个会列出大量可能的索引的QEP意味着备选索引数量太多了,同时也可能提示存在一个无效的单列索引。

key_len

key_len列定义了用于SQL语句的连接条件的键的长度。
此列值对于确认索引的有效性以及多列索引中用到的列的数目很重要。

table

table列是EXPLAIN命令输出结果中的一个单独行的唯一标识符。
这个值可能是表名,表的别名或者一个为查询产生临时表的标识符,如派生表,子查询或集合。

select_type

MySQL的EXPLAIN命令详解(背就完事了)_第13张图片

simple

对于不包含子查询和其他复杂语法的简单查询,这是一个常见类型。

primary

这是为更复杂的查询而创建的首要表(最外层表)。这个类型通常可以在derived和union类型混合使用时见到。

derived

当一个表不是一个物理表时,就被叫做derived。

dependent subquery

这个select_type值是为使用子查询而定义的。

union

这是union语句其中的一个sql元素。

union result

这是一系列定义在union语句中的表的返回结果。

partitions

在这里插入图片描述

Extra

MySQL的EXPLAIN命令详解(背就完事了)_第14张图片

using where

MySQL的EXPLAIN命令详解(背就完事了)_第15张图片

using temporary

MySQL的EXPLAIN命令详解(背就完事了)_第16张图片

using filesort

MySQL的EXPLAIN命令详解(背就完事了)_第17张图片

Using index

这个值重点强调了只需要使用索引就可以满足查询表的要求,不需要直接访问表数据.

using join buffer

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

Impossible where

MySQL的EXPLAIN命令详解(背就完事了)_第18张图片

select tables optimized away

MySQL的EXPLAIN命令详解(背就完事了)_第19张图片在这里插入图片描述

DistinctMySQL的EXPLAIN命令详解(背就完事了)_第20张图片

index merges

MySQL的EXPLAIN命令详解(背就完事了)_第21张图片

id

MySQL的EXPLAIN命令详解(背就完事了)_第22张图片

ref

在这里插入图片描述

filtered

MySQL的EXPLAIN命令详解(背就完事了)_第23张图片

type

MySQL的EXPLAIN命令详解(背就完事了)_第24张图片

解释EXPLAIN输出结果

理解你的应用程序和优化SQL语句同等重要。
下面给出一个父子关系中获取孤立的父辈记录的商业需求的例子。
这个查询可以用三种不同的方式构造。尽管产生相同的结果,但QEP会显示三种不同的路径。
第一种:
MySQL的EXPLAIN命令详解(背就完事了)_第25张图片MySQL的EXPLAIN命令详解(背就完事了)_第26张图片
第二种:
MySQL的EXPLAIN命令详解(背就完事了)_第27张图片MySQL的EXPLAIN命令详解(背就完事了)_第28张图片
第三种:
MySQL的EXPLAIN命令详解(背就完事了)_第29张图片MySQL的EXPLAIN命令详解(背就完事了)_第30张图片

你可能感兴趣的:(SQL优化系列)