mysql-explain-1

96 阅读2分钟

mysql-explain

usage

sql语句explain select|update ..;

keynote
id编号标识
select_type查询的类型
table
partitions匹配的分区
type表示表的连接类型
possible_keys表示查询时,可能使用的索引
key表示实际使用的索引
key_len索引字段的长度
ref列与索引的比较
rows扫描出的行数(估算的行数)
filtered按表条件过滤的行百分比
Extra执行情况的描述和说明

key

id

SELECT的查询序列号;

  • id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
  • 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

select_type

  • SIMPLE,简单SELECT不使用UNION或子查询等

  • PRIMARY(优先级),子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY

  • DERIVED,派生表的SELECT,FROM子句的子查询,(大部分时候primary,derived一起出现)

  • SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)

  • DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询)

  • UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)

  • UNION,UNION中的第二个或后面的SELECT语句

  • DEPENDENT UNION, UNION中的第二个或后面的SELECT语句,取决于外面的查询

  • UNION RESULT(UNION的结果union语句中第二个select开始后面所有select

table

查询使用的表

type

ALL、index、range、 ref、eq_ref、const、system,从左到右,性能从差到好

  • ALL:Full Table Scan, 不使用索引,全表扫描
  • index: Full Index Scan, 使用索引全表扫描
  • range: 使用索引范围查询 => 上面的SQL基本都需要优化
  • ref: 使用普通索引,等值查询,返回多行数据;1:N
  • eq_ref: 使用唯一索引等值查询,返回一行数据;1:1
  • const,system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system

possible_keys

可能使用的索引

key

实际使用的索引

key_len

索引的长度

rows

估算查询结果

filtered

查询条件过滤百分比

extra

  • Using where
  • Using temporary 使用临时币表,groupby, orderby
  • Using join buffer, join没有使用索引,并使用了缓存