文章目录

  • 语法
  • 各列详解
  • 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://s2.51cto.com/images/blog/202311/25043701_6561096df397d59980.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
  • index merges
  • id
  • ref
  • filtered
  • type
  • 解释EXPLAIN输出结果



MySQL的EXPLAIN命令用于

SQL语句的查询执行计划(QEP).


这条命令的输出结果能够让我们了解MYSQL优化器是如何执行SQL语句的。

语法

QEP是通过EXPLAIN命令生成的,它的语法包含两项:

mysql poolPrepared Statements的作用 mysql preparing_子查询


EXPLAIN如果作用在表上,那么此命令等同于DESC表命令。

UPDATE和DELETE如果要优化则需要把它们改写成SELECT语句然后执行EXPLAIN.

mysql poolPrepared Statements的作用 mysql preparing_子查询_02


这个UPDATE语句可以被重写成下面的SELECT语句:

mysql poolPrepared Statements的作用 mysql preparing_子查询_03


存储过程缓存仅仅解析查询数。MySQL优化器是基于开销来工作的,它不提供任何QEP(查询执行计划)的位置。

各列详解

MySQL EXPLAIN命令能够为sql语句中的每一个表生成以下信息:

mysql poolPrepared Statements的作用 mysql preparing_子查询_04


这个QEP(查询执行计划)显示没有使用任何索引并且处理了大量的行来满足查询。

对同样一条select语句,一个优化过的QEP如下:

mysql poolPrepared Statements的作用 mysql preparing_SQL_05

mysql poolPrepared Statements的作用 mysql preparing_子查询_06


在这个QEP中我们看到它使用了一个索引,且只有一行数据被获取。

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

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

key

key列指出优化器选择使用的索引。

一般来说SQL查询中的每一个表都仅使用一个索引。

也存在索引合并的少数例外情况,如给定表上用到了两个或者更多索引:

mysql poolPrepared Statements的作用 mysql preparing_SQL_07


show create table < table>命令是最简单的查看表和索引列细节的方式。

rows

rows列提供了试图分析所有存在于累计结果集中的行数的MySQL优化器估计值。

查询中总的读操作数量是基于合并之前行的每一行的rows值的连续积累而得出的。这是一种嵌套算法。

mysql poolPrepared Statements的作用 mysql preparing_MySQL_08

mysql poolPrepared Statements的作用 mysql preparing_MySQL_09

mysql poolPrepared Statements的作用 mysql preparing_子查询_10

mysql poolPrepared Statements的作用 mysql preparing_SQL_11

mysql poolPrepared Statements的作用 mysql preparing_SQL_12

mysql poolPrepared Statements的作用 mysql preparing_SQL_13

possible_keys

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

key_len

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

table

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

select_type

mysql poolPrepared Statements的作用 mysql preparing_子查询_14

simple

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

primary

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

derived

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

dependent subquery

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

union

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

union result

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

partitions

mysql poolPrepared Statements的作用 mysql preparing_子查询_15

Extra

mysql poolPrepared Statements的作用 mysql preparing_子查询_16

using where

mysql poolPrepared Statements的作用 mysql preparing_MySQL_17

using temporary

mysql poolPrepared Statements的作用 mysql preparing_MySQL_18

using filesort

mysql poolPrepared Statements的作用 mysql preparing_子查询_19

Using index

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

using join buffer

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

Impossible where

mysql poolPrepared Statements的作用 mysql preparing_SQL_20

select tables optimized away

mysql poolPrepared Statements的作用 mysql preparing_MySQL_21

mysql poolPrepared Statements的作用 mysql preparing_SQL_22

Distinct

mysql poolPrepared Statements的作用 mysql preparing_子查询_23

index merges

mysql poolPrepared Statements的作用 mysql preparing_SQL_24

id

mysql poolPrepared Statements的作用 mysql preparing_子查询_25

ref

mysql poolPrepared Statements的作用 mysql preparing_子查询_26

filtered

mysql poolPrepared Statements的作用 mysql preparing_MySQL_27

type

mysql poolPrepared Statements的作用 mysql preparing_MySQL_28

解释EXPLAIN输出结果

理解你的应用程序和优化SQL语句同等重要。

下面给出一个父子关系中获取孤立的父辈记录的商业需求的例子。

这个查询可以用三种不同的方式构造。尽管产生相同的结果,但QEP会显示三种不同的路径。

第一种:

mysql poolPrepared Statements的作用 mysql preparing_MySQL_29

mysql poolPrepared Statements的作用 mysql preparing_SQL_30


第二种:

mysql poolPrepared Statements的作用 mysql preparing_SQL_31

mysql poolPrepared Statements的作用 mysql preparing_子查询_32


第三种:

mysql poolPrepared Statements的作用 mysql preparing_子查询_33

mysql poolPrepared Statements的作用 mysql preparing_MySQL_34