实际上在MySQL索引原理之索引分析 - 池塘里洗澡的鸭子 中已经使用到查看执行计划的命令explain,也进行了各列选项的解释。本文进行补充同时介绍如何分析一条SQL语句的执行性能及需要关注哪些信息。

  1)id:包含一组数字,表示查询中执行select子句或操作表的顺序;执行顺序从大到小执行:当id值 一样时,执行顺序由上往下。

  2)select_type:

    DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生),或者说当一个表不是一个物理表时,那么就被叫作DERIVED。

  3)possible_keys:

    指出MySQL能使用哪个索引在表中找到行,查询涉及的字段上若存在索引,则该索引将被列出但不一定被查询使用。一个会列出大量可能的索引(如多于3个)的QEP意味着备选索引熟练太多了,同时也可能提示存在一个无效的单列索引。

  4)ref:表示上述表的连续匹配条件,即哪些列或常量被用于查找索引列上的值。

  5)extra:

      using join buffer:这个强调了在获取连续条件时没有使用索引,并且需要连续缓存区来存储中间结果。如果出现了这个值,则应该根据查询的具体情况可能需要添加索引来改进性能。

      impossible where:这个值强调了where语句会导致没有符合条件的行。

      select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行。

      distinct:这个值意味着MySQL在找到第一个匹配的行之后就会停止搜索其他行。

      index merges:当MySQL决定要在一个给定的表上使用超过一个索引时就会出现,用来详细说明使用的索引以及合并的类型。

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

      patitions:代表给定表所使用的分区。这一列只会在explain partitions语句中出现。

      filtered:给出了一个百分比的值,这个百分比值和rows列的值一起使用,可以估计出哪些将要和QEP中的前一个表进行连续的行的数目。前一个表就是指id列的值比当前表的id小的表。这一列只有在explain extended语句中才会出现。使用explain extended和 show warnings语句能够看到SQL在真正被执行之前优化器做老孔哪些SQL改写。

  那如何分析一条SQL遇见的执行性能及需要关注哪些信息呢?具体操作是:使用explain命令,观察type列可以知道是否是全表扫描、可以知道索引的使用形式;观察key可以知道使用了哪个索引;观察key_len可以知道索引是否使用完成;观察rows可以知道扫描的行数是否过多;观察extra可以知道是否使用了临时表和进行了额外的排序操作。