高性能MySQL(第3版)EXPLAIN

附录D EXPLAIN

要使用EXPLAIN ,只需在查询中的SELECT 关键字之前增加EXPLAIN这个词。MySQL会在查询上设置一个标记。当执行查询时,这个标记会使其返回关于在执行计划中每一步的信息,而不是执行它。它会返回一行或多行信息,显示出执行计划中的每一部分和执行的次序。

在查询中每个表在输出中只有一行。如果查询是两个表的联接,那么输出中将有两行

Id 列

这一列总是包含一个编号,标识SELECT 所属的行。如果在语句当中没有子查询或联合,那么只会有唯一的SELECT ,于是每一行在这个列中都将显示一个1。否则,内层的SELECT 语句一般会顺序编号,对应于其在原始语句中的位置。

select_type列

这一列显示了对应行是简单还是复杂SELECT (如果是后者,那么 是三种复杂类型中的哪一种)。SIMPLE 值意味着查询不包括子查询和 UNION 。如果查询有任何复杂的子部分,则最外层部分标记为PRIMARY。

  • SUBQUERY
    包含在SELECT 列表中的子查询中的SELECT (换句话说,不在FROM 子句中)标记为SUBQUERY 。
  • DERIVED
    DERIVED 值用来表示包含在FROM 子句的子查询中的SELECT ,MySQL会递归执行并将结果放到一个临时表中。服务器内部称其“派生表”,因为该临时表是从子查询中派生来的。
table列

这一列显示了对应行正在访问哪个表

派生表和联合

当在FROM 子句中有子查询时,table列是的形式,其中 N 是子查询的id 。这总是“向前引用”——换言之, N 指向EXPLAIN 输出中后面的一行。查询顺序是从下往上执行(按照id大小从大到小执行)
在这里插入图片描述
当有UNION 时,UNION RESULT 的table 列包含一个参与UNION 的id列表。这总是“向后引用”,因为UNION RESULT 出现在UNION 中所有参与行之后
在这里插入图片描述

type列

MySQL用户手册上说这一列显示了“关联类型”,但我们认为更准确 的说法是访问类型——换言之就是MySQL决定如何查找表中的行。下面是最重要的访问方法,依次从最差到最优。

  • ALL
    人们所称的全表扫描,通常意味着MySQL必须扫描整张表,从头到尾,去找到需要的行。(这里也有个例外,例如在查询里使用了LIMIT ,或者在Extra 列中显示“Using distinct/not exists”。)
  • index
    这个跟全表扫描一样,只是MySQL扫描表时按索引次序进行而不是行。它的主要优点是避免了排序;最大的缺点是要承担按索引次序读取整个表的开销。这通常意味着若是按随机次序访问行,开销将会非常大。
    如果在Extra 列中看到“Using index”,说明MySQL正在使用 覆盖索引,它只扫描索引的数据,而不是按索引次序的每一行。它比按索引次序全表扫描的开销要少很多。
  • range
    范围扫描就是一个有限制的索引扫描,它开始于索引里的某一点,返回匹配这个值域的行。这比全索引扫描好一些,因为它用不着遍历全部索引。显而易见的范围扫描是带有BETWEEN 或在WHERE子句里带有>的查询。
    当MySQL使用索引去查找一系列值时,例如IN() 和OR 列表,也会显示为范围扫描。然而,这两者其实是相当不同的访问类型,在性能上有重要的差异。更多信息可以查看第5章的文章“什么是范围条件”。
    此类扫描的开销跟索引类型相当。
  • ref
    这是一种索引访问(有时也叫做索引查找),它返回所有匹配某个单个值的行。然而,它可能会找到多个符合条件的行,因此,它是查找和扫描的混合体。此类索引访问只有当使用非唯一性索引或者唯一性索引的非唯一性前缀时才会发生。把它叫做ref 是因为索引要跟某个参考值相比较。这个参考值或者是一个常数,或者是来自多表查询前一个表里的结果值。
  • eq_ref
    使用这种索引查找,MySQL知道最多只返回一条符合条件的记录。这种访问方法可以在MySQL使用主键或者唯一性索引查找时看到,它会将它们与某个参考值做比较。MySQL对于这类访问类型的优化做得非常好,因为它知道无须估计匹配行的范围或在找到匹配行后再继续查找。
  • const, system
    当MySQL能对查询的某部分进行优化并将其转换成一个常量时,它就会使用这些访问类型。举例来说,如果你通过将某一行的主键放入WHERE 子句里的方式来选取此行的主键,MySQL 就能把这个查询转换为一个常量。然后就可以高效地将表从联接执行中移除。
possibIe_keys列

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

key列

这一列显示了MySQL 决定采用哪个索引来优化对该表的访问。如果该索引没有出现在possible_keys 列中,那么MySQL选用它是出于另 外的原因——例如,它可能选择了一个覆盖索引,哪怕没有WHERE子句。
换句话说,possible_keys 揭示了哪一个索引能有助于高效地行查 找,而key显示的是优化采用哪一个索引可以最小化查询成本。

key_len列

该列显示了MySQL在索引里使用的字节数。如果MySQL正在使用 的只是索引里的某些列,那么就可以用这个值来算出具体是哪些列

ref 列

这一列显示了之前的表在key 列记录的索引中查找值所用的列或常量。下面是一个展示关联条件和别名组合的例子。注意,ref 列反映了在查询文本中film 表是如何以f为别名的。
在这里插入图片描述

rows 列

这一列是MySQL估计为了找到所需的行而要读取的行数。这个数 字是内嵌循环关联计划里的循环数目。也就是说它不是MySQL认为它最终要从表里读取出来的行数,而是MySQL为了找到符合查询的每一 点上标准的那些行而必须读取的行的平均数。

Extra 列

这一列包含的是不适合在其他列显示的额外信息

  • “Using where”
    这意味着MySQL服务器将在存储引擎检索行后再进行过滤。许多WHERE 条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带WHERE 子句的查询都会显示“Using where”。有时“Using where”的出现就是一个暗示:查询可受益于不同的索引。
  • “Using filesort”
    这意味着MySQL会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。MySQL有两种文件排序算法,你可以在第6章读到相关内容。两种方式都可以在内存或磁盘上完成。EXPLAIN 不会告诉你MySQL将使用哪一种文件排序,也不会告诉你排序会在内存里还是磁盘上完成。
  • “Using index”
    此值表示MySQL将使用覆盖索引,以避免访问表。不要把覆盖索引和index 访问类型弄混了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值