Explain
使用EXPLAIN关键字可以模仿优化器执行SQL查询语句,从而知道MySQL是如何处理SQL语句,分析SQL语句的性能瓶颈出现在哪里。
显示信息
id
select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序。
id相同,执行顺序由上至下。id不同(子查询的时候),id值越高,优先级越高,越先执行。
select_type
select_type,查询类型,用于区别普通查询、联合查询、子查询等复杂查询。
- SIMPLE,简单SELECT查询,不包含子查询和UNION
- PRIMARY,查询中包含子查询,最外层标记为PRIMARY
- SUBQUERY,子查询标记为SUBQUERY
- DERIVED,临时表的衍生
- UNION,第二个SELECT出现在UNION之后,则标记为UNION
- UNION RESULT,从UNION表获取结果的SELECT
table
显示是哪张表
type
访问类型。system>const>eq_ref>ref>range>index>ALL
保证查询达到range级别,最好达到ref。
- system,表只有一行记录,等于系统表
- const,表示通过索引一次就找到了记录
- eq_ref,联表查询,表中只有一条记录与索引键匹配
- ref,返回所有匹配某个单独值的行
- range,只检索给定范围的行
- index,只遍历整个索引树
- ALL,扫描整个表
possible_keys
显示可能应用在这张表中的索引,一个或多个。查询设计到的字段若存在索引,则该索引将被列出,但不一定被实际查询使用。
key
实际使用的索引。可以用来判断索引是否失效。
key_len
表示索引中使用的字节数,可以通过该列计算查询中使用的索引的长度。越少越好。
ref
显示索引的哪一列被使用了。
rows
大致估算找到所需的记录所需要读取的行数。
Extra
包含不适合在其他列显示但十分重要的额外信息。
- Using filesort,对数据使用一个外部的索引(文件排序)排序,不是按照表内的索引顺序。
- Using temporary,使用了临时表保存中间结果用于排序或分组,常见group by和order by。
- Using index,表示相应的select使用了覆盖索引,避免访问了表的数据行。
- Using where,使用了where过滤
- Using join buffer,使用了连接缓存