文章目录
MySQL的EXPLAIN命令用于 SQL语句的查询执行计划(QEP).
这条命令的输出结果能够让我们了解MYSQL优化器是如何执行SQL语句的。
语法
QEP是通过EXPLAIN命令生成的,它的语法包含两项:
EXPLAIN如果作用在表上,那么此命令等同于DESC表命令。
UPDATE和DELETE如果要优化则需要把它们改写成SELECT语句然后执行EXPLAIN.
这个UPDATE语句可以被重写成下面的SELECT语句:
存储过程缓存仅仅解析查询数。MySQL优化器是基于开销来工作的,它不提供任何QEP(查询执行计划)的位置。
各列详解
MySQL EXPLAIN命令能够为sql语句中的每一个表生成以下信息:
这个QEP(查询执行计划)显示没有使用任何索引并且处理了大量的行来满足查询。
对同样一条select语句,一个优化过的QEP如下:
在这个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值的连续积累而得出的。这是一种嵌套算法。
possible_keys
possible_keys列指出优化器为查询选定的索引。
一个会列出大量可能的索引的QEP意味着备选索引数量太多了,同时也可能提示存在一个无效的单列索引。
key_len
key_len列定义了用于SQL语句的连接条件的键的长度。
此列值对于确认索引的有效性以及多列索引中用到的列的数目很重要。
table
table列是EXPLAIN命令输出结果中的一个单独行的唯一标识符。
这个值可能是表名,表的别名或者一个为查询产生临时表的标识符,如派生表,子查询或集合。
select_type
simple
对于不包含子查询和其他复杂语法的简单查询,这是一个常见类型。
primary
这是为更复杂的查询而创建的首要表(最外层表)。这个类型通常可以在derived和union类型混合使用时见到。
derived
当一个表不是一个物理表时,就被叫做derived。
dependent subquery
这个select_type值是为使用子查询而定义的。
union
这是union语句其中的一个sql元素。
union result
这是一系列定义在union语句中的表的返回结果。
partitions
Extra
using where
using temporary
using filesort
Using index
这个值重点强调了只需要使用索引就可以满足查询表的要求,不需要直接访问表数据.
using join buffer
这个值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果.
如果出现这个值,我们可以根据查询的具体情况添加索引改进性能.
Impossible where
select tables optimized away
Distinct![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c9ab96a5160a010c5bd7e2e8df961d76.png)
index merges
id
ref
filtered
type
解释EXPLAIN输出结果
理解你的应用程序和优化SQL语句同等重要。
下面给出一个父子关系中获取孤立的父辈记录的商业需求的例子。
这个查询可以用三种不同的方式构造。尽管产生相同的结果,但QEP会显示三种不同的路径。
第一种:
第二种:
第三种: