mysql explain

71 阅读3分钟

image.png

通过explain 我们可以获取到这些信息

  • 表的读取顺序
  • 数据读取操作的的操作类型
  • 哪些索引可以使用
  • 哪些索引被实际使用
  • 表之间的引用
  • 每张表有多少行被优化器使用

id

id可以认为是查询序列号,每个id代表对应的查询,id大优先级高,优先级高的先执行

select_type 查询的类型

  1. SIMPLE (简单的select,不使用UNION或子查询)
  2. PRIMARY (子查询中的外层查询,最外层的select被标记为PRIMARY)
  3. UNION (UNION中的第二个或后面的select语句)
  4. DEPENDENT UNION (和UNION同理,取决于外层查询)
  5. UNION RESULT (UNION的结果,UNION语句中第二个select开始后面所有的select)
  6. SUBQUERY (子查询中的第一个select,不依赖外部查询)
  7. DEPENDENT SUBQUERY (子查询中的第一个select,以来外部查询)
  8. DERIVED (派生表的select,from子句的子查询)
  9. UNCACHEABLE SUBQUERY (一个子查询的接口不能被缓存,必须重新评估外链接的第一行)

table 输出结果集的表

显示的数据关于哪张表,有时显示的自定义的简称表名

type 表示对表的访问方式

这里只记一些常用的

ALL、index、range、ref、eq_ref、const、system、NULL (性能从差到好)

  • All: mysql将遍历全表
  • index: 只遍历索引树
  • range: 只遍历给定范围的数据
  • ref: 表示上述表的连接匹配条件,即哪些字段或常量被用于查找索引列上的值
  • eq_ref: 和ref的区别在于 索引是唯一索引
  • const: 将主键作为条件
  • system: const的特例,当查询出来的数据只有一条时
  • null: 执行时甚至不用访问表或索引,例如从一个索引列里选取最小值,可以通过单独索引查找完成

possible key

表示查询数可能使用的索引,指出mysql能使用哪个索引在表中找到记录,查询涉及到的字段若涉及到索引则该索引被列出,但是不一定被查询所使用,如果没有任何索引显示null

key

表示实际使用到的索引

key_len

索引字段的长度,可通过该列计算 查询中使用的索引的长度(key_len显示的值是索引字段的最大可能长度,而不是实际使用长度)

ref

列与索引的比较。表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。

rows

扫描出的行数,估算出结果集行数

extra

执行情况的描述和说明。

  • Using where 仅通过索引就可以获取所需数据
  • Using temporary mysql需要使用临时存储表来存储结果集
  • Using filesort 存在order by 并且无法利用索引排序的,称为‘文件排序’
  • Using join buffer 获取连接时没有使用索引,并且需要连接缓存区来存储中间结果,建议添加索引
  • Impossible where where语句会导致没有符合条件的行
  • Select table optimized ayay 意味着仅通过使用索引,优化器仅从聚合函数结果集中返回一行
  • No tables used Query语句中使用from dual 或 不含任何 from子句