亲宝软件园·资讯

展开

MySQL EXPLAIN

刘Java​​​​​​​ 人气:0

前言

调用EXPLAIN可以获取关于查询执行计划的信息,以及如何解释输出。EXPLAIN命令是查看查询优化器如何决定执行查询的主要方法,但该动能也有局限性,它的选择并不总是最优的,展示的也并不一定是真相。

1 调用EXPLAIN

要使用EXPLAIN,只需要在SELECT 关键字之前增加 EXPLAIN这个词。MySQL会在查询上设置一个标记。当执行查询时,这个标记会使其返回关于在执行计划中每一步的信息,而不是真正完全的执行该语句。

它会返回一行或多行信息,显示出执行计划中的每一部分和执行的次序。在查询中,每个表的输出只有一行,若多表关联,则输出多行。别名表单算为一个表,因此如果把表和自己连接,输出中也会有两行。这里的表的定义非常的广:可以是一个子查询,一个 UNION 结果。

EXPLAIN有两个变种:

增加了EXPLAIN之后,MySQL可能仍然会执行部分查询,如果查询中FROM字句中包括子查询,那么MySQL实际会执行子查询的,并将其结果放在一个临时表中,然后完成外层查询优化。

EXPLAIN 返回的只是个近似结果,并且还有相关是的限制:

2 EXPLAIN中的列

2.1 id

一个编号,表示select所属的行。如果查询中没有子查询或关联查询,那么只会有唯一的SELECT,每一行的该列中都将显示一个1,否则,内层的SELECT语句一般会顺序编号,对应于其在原始语句中的位置。id越大执行优先级越高,id相同则认为是一组,从上往下执行,id为NULL最后执行。

例如UNION查询中最后对于临时表的查询,它的id就为null,因为临时表并不在原sql中出现。

EXPLAIN select * from contacts where contact_id <1000
UNION 
select * from contacts where contact_id >99000

2.2 select_type

表示对应行是简单还是复杂的查询。

其他部分标记如下:

除了上面这些,SUBQUERY和UNION还可以被标记为DEPENDENT和UNCACHEABLE,DEPENDENT意味着SELECT 依赖与外层查询中发现的数据;UNCACHEABLE意味着SELECT 中的某些特性阻止结果被缓存于一个 Item_cache 中。

EXPLAIN select * from contacts where contact_id =99000

2.3 table

显示了EXPLAIN对应行正在访问哪个表。通常情况下,它相当表明了:那就是那个表,或者该表的别名。

可以通过该列从上到下观察MySQL的关联优化器为查询选择的关联顺序。

from字句中有子查询的时候,table列是<derivedN>的形式,N指向子查询id,这里N总是指向EXPLAIN输出结果中的后面的一行。

当有UNION时,UNION RESULT的table列包含一个参与UNION的id列表,UNION RESULT总是出现在UNION中所有参与行之后,例如<union 1,2>

2.4 type

关联类型,或者说访问类型,该字段表明MySQL决定如何查找表中的行。

常用的访问类型如下(性能依次从最差到最优):

2.5 possible_keys

显示查询可以使用哪些索引,这是基于查询访问的列和使用的比较操作符来判断的。该列表是在优化过程的早期创建的,因此列出来的索引对于后续实际优化过程可能是没有用的。

2.6 key

显示mysql决定采用哪一个索引来优化对该表的访问,如果该索引没有出现在possible_keys列中,那么MySQL选用它是出于另外的原因——例如,它可能选择了一个覆盖索引,哪怕它没有WHERE字句。

possible_keys表示哪些索引有助于高效查找,而key表示该索引可以最小化查询成本。

如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX

2.7 key_len

MySQL在索引中使用的字节数,通过这个值可以算出具体使用了索引中的哪些列,计算时需要考虑字符集,如果字段允许为 NULL,需要1字节记录是否为 NULL。

key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。

2.8 ref

这一列显示了在key列记录的索引中,表查找值所用到的列或常量,即哪些列或常量被用于查找索引列上的值。常见的有:const(常量),func,NULL,字段名(例:film.id)

2.9 rows

这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数,而是MySQL为了找到符合查询的每一个标准的那些行而必须读取的行的平均数。

有时候该估值可能很不精确,该数字也反映不了LIMIT字句的真正检查行数。

2.10 Extra

这一列展示的是额外信息。常见的重要值如下:

加载全部内容

相关教程
猜你喜欢
用户评论