EXPLIAN-修订版

查询优化必备神器—EXPLAIN

学习解释EXPLAIN将帮助你了解MySQL优化器是如何工作的。要使用EXPLAIN,只需要在查询的SELECT关键字之前加上EXPLIAN这个词,MySQL会在查询上设置一个标志。当执行一个查询时,这个标志会使其返回在执行计划中每一步的信息,而不是执行它。增加EXPLAIN时在查询在FROM子句中包括子查询的情况下,会执行子查询。

EXPLAIN中的列总是10个列,分别是id、 select_type、 table、 type、 possible_keys、 key、key_len、 ref、 rows、 Extra,只有EXPLAIN EXTENDED在MySQL5.1增加了一个filtered列,EXPLAIN PARTITIONS 增加了一个Partitions列)。

使用EXPLAIN解析SQL执行计划时,如果有下面几种情况,就需要特别关注下了:

  • 首先看下 type 这列的结果,如果有类型是 ALL 时,表示预计会进行全表扫描(full table scan)。通常全表扫描的代价是比较大的,建议创建适当的索引,通过索引检索避免全表扫描。

  • 再来看下 Extra 列的结果,如果有出现 Using temporary 或者 Using filesort 则要多加关注:

    • Using temporary,表示需要创建临时表以满足需求,通常是因为GROUP BY的列没有索引,或者GROUP BY和ORDER BY的列不一样,也需要创建临时表,建议添加适当的索引。
    • Using filesort,表示无法利用索引完成排序,也有可能是因为多表连接时,排序字段不是驱动表中的字段,因此也没办法利用索引完成排序,建议添加适当的索引。
    • Using where,通常是因为全表扫描或全索引扫描时(type 列显示为 ALL 或 index),又加上了WHERE条件,建议添加适当的索引。
    • 其他状态例如:Using index、Using index condition、Using index for group-by 则都还好,不用紧张。

Select_type列

这一列显示了对应行是简单还是复杂SELECT。如果是简单查询,则显示SIMPLE值,如果是复杂的查询,最外层部分均标记为PAIMARY。接下来根据复杂查询的种类,简单子查询显示SUBQUERY,如果是派生表显示DERIVED,如果是UNION查询显示UNION。

MySQL把SELECT查询分为简单和复杂查询,复杂类型可分为三类:简单子查询、所谓的派生表、以及UNION查询。上面的那条查询语句就是简单子查询,FROM子句中的子查询就是所谓的派生表。

table列

这一列显示了对应行在访问哪一个表。可以在这一列中从上往下观察MySQL的关联优化器为查询选择的关联顺序。

Type列

表示访问类型,就是MySQL决定如何查找表中的行,下面的访问方法依次从最差到最优。

  • ALL
    最差的方法,利用全表扫描
  • Index
    这个跟全表扫描一样,只是MySQL扫描表时按索引次序进行而不是行。他的主要优点是避免了排序。最大的缺点是要承担按索引次序读取整张表的开销。意味着随机次序访问行,开销很大。如果在Extra列中看到“Using index”,说明使用的是覆盖索引。
  • Range
    范围扫描就是一个有限制的索引扫描,开始于索引里的某一点,返回匹配这个值域的行。比全索引扫描好一点,不用遍历全部索引,当MySQL使用索引去查找一系列的值时,例如IN()和OR列表,也会显示为范围查询。
  • Ref
    这是一种索引访问,返回所有匹配某个单个值的行,它是查找和扫描的混合体,此类索引访问只有当使用了非唯一性索引或者唯一性索引的非唯一性前缀才会发生。
  • eq_ref
    使用这种索引查找,MySQL知道最多会只会返回一条符合条件的记录。这种访问方法只会在MySQL使用主键或者唯一性索引查找才会看到。
  • Const,system
    当MySQL能够对查询的某一部分进行优化并将其转换为一个常量时,就会使用这些访问类型。

Key列

这一列显示了MySQL决定使用哪个索引来优化对表的访问,如果该索引没有出现在possible_key列中,说明MySQL选择了覆盖索引

Extra列

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

Using index使用覆盖索引。

Using filesort代表在进行关联查询时用到了文件排序,并且ORDER BY子句中的所有的列都来自关联的第一个表,MySQL在关联处理第一个表的时候就进行文件排序。

Using temporary;Using filesort代表会将关联的结果先存放在一个临时表中,等到所有的关联都结束时,再进行文件排序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章