MySQL(4)——Explain详解

一、Explain

可以查看执行计划,模拟优化器执行SQL
用法: explain
可以:

  • 查看表的读取顺序(id)
  • 数据读取操作的操作类型(type)
  • 哪些索引可以使用(possible_keys)
  • 哪些索引实际被使用(key)
  • 表之间的引用(ref)
  • 每张表有多少行被优化器查询(rows)

二、字段解释

±—±------------±------±------±------------------±--------±--------±------±-----±------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
±—±------------±------±------±------------------±--------±--------±------±-----±------+

(一) id

select查询的序列号,包含一组数字

  • id相同 ,执行顺序由上至下
  • id不同,id值越大,越先执行
  • id有相同有不同,先执行id大的,顺序执行id相同的

(二) select_type

  • simple 简单的select(不使用UNION或子查询等)
  • primary 最外层的查询(查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
  • subquery 子查询
  • derived 临时表,衍生表
  • union 若第二个select出现在union后面,则标记为union;若union包含在from子句中,则外层的select为derived
  • union result union的结果,union语句中第二个select开始后面所有select

(三)table

表示这一行数据是关于哪张表的

(四)type

访问的类型
常用的有(性能由好到差):
system>const>eq_ref>ref>range>index>all
(一般优化至ref、range阶段即可)

  • system 只有一行记录
  • const 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这个类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。
  • eq_ref 使用唯一性索引扫描时。对每个索引,表中只有一条记录与之匹配。比如:多表连接中使用primary key或者 unique key作为关联条件。
  • ref 使用非唯一索引扫描。返回匹配某个单独值的行,可能返回多个符合条件的行。属于查找和扫描的混合体。
  • range 范围查询,使用一个索引来选择行(between,in,< >)
  • index Full Index Scan,全索引扫描,通常比ALL快
  • all Full Table Scan, MySQL将遍历全表以找到匹配的行

(五)possible_keys

显示可能应用在这张表的索引,可以是1个或多个。查询涉及的字段上若有索引,则该索引将被列出,但是不一定被查询实际使用。

(六)key

实际使用的索引。
查询中若使用了覆盖索引,则该索引仅在key中列出。

(七)key_len

索引中使用的字节数,最大的可能长度,并非实际使用长度。

(八)ref

显示索引哪一列被使用了,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。
如果可能,最好是常量。

(九)rows

根据表统计信息及索引适用范围,大致估算出找到所需的记录需要读取的行数。

(十)Extra

  • Using filesort(重要)需要优化。mysql无法使用索引来完成排序操作。
  • Using temporary(重要)需要优化。表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by ; order by
  • Using index(重要)使用了索引,不需要优化
  • Using where 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。
  • Using join buffer 强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引或增大join buffer的值来改进能。
  • impossible where where语句会导致没有符合条件的行
  • select tables optimized away 这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行
  • distinct 一旦MYSQL找到了与行相联合匹配的行,就不再搜索了

你可能感兴趣的:(MySQL,mysql,索引,数据库)