MySQL的执行计划(三)


书接上回 MySQL的执行计划(二)

执行计划中的列

possible_keys

显示在查询中使用了哪些索引
在这里插入图片描述

key

  • 实际使用的索引,如果为NULL,则没有使用索引;
  • 查询中如果使用了覆盖索引,则该索引仅出现在key列中。
    在这里插入图片描述
  • possible_keys列表明哪一个索引有助于更高效的查询;
  • key是possible_keys的子集;
  • 而key列表明实际优化采用了哪一个索引可以更加高效。

key_len

表示索引中使用的字节数,查询中使用的索的长度(最大可能长度),并非实际使用长度,理论上长度越短越好。

  • key_len是根据表定义计算而得的,不是通过表内查询出来的
  • 这个字段可以评估组合索引是否完全被使用,这也是我们优化sql时,评估索引的重要指标

ref

  • 表示在key列记录的索引中查找值,所用的列或常量const。

rows

估算出找到所需行而要读取的行数
在这里插入图片描述
这个数字是内嵌循环关联计划里的循环数,它不是最终从表中读取出来的行数,而是MySQL为了找到符合查询的那些行而必须读取行的平均数,只能作为一个相对数来进行衡量。

  • 估算该sql返回结果集需要扫描读取的行数,这个值相关重要;
  • 索引优化之后,扫描读取的行数越多,说明要么是索引设置不对,要么是字段传入的类型之类的问题,说明要优化空间越大

filtered

  • 返回结果的行数占读取行数的百分比,值越大越好;
  • 百分比越高,说明需要查询到数据越准确;
  • 百分比越小,说明查询到的数据量大,而结果集很少。

extra

额外信息

Using index
表示SQL中使用了覆盖索引。
在这里插入图片描述

Using where
许多where条件里是涉及索引中的列,当它读取索引时,就能被存储引擎检验,因此不是所有带·where子句的查询都会显示“Using where”。
在这里插入图片描述

Using temporary

  • 对查询结果排序时,使用了一个临时表,常见于order by 和group by
    在这里插入图片描述

Using filesort

  • 对数据使用了一个外部的索引排序,而不是按照表内的索引进行排序读取;
  • MySQL无法利用索引完成的排序操作成为“文件排序”。
    在这里插入图片描述

Author: stream
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source stream !
  TOC