使用方法
explain select * from t
字段解释
id
select 查询序列号,表示sql语句执行的顺序
select_type
- simple: 表示最简单的select,没有union和子查询
- primary: 最外面的查询或者主查询,在有子查询的语句中,最外面的select查询就是primary
- subquery: 子查询
- union: union语句的第二个或者最后那一个select
- union result: unino之后的结果
- derived:衍生表
table
所查询的表,简称,或者是中间表
type
- const: 表中最多有一个匹配行,const用于比较primary key 或者unique索引快
- eq_ref: 唯一性索引扫描,对于每个来自于前面的表的记录,从该表中读取唯一一行
- ref: 非唯一性索引扫描,对于每个来自于前面的表的记录,所有匹配的行从这张表取出
- index_merge:查询语句中用到了一张表的多个索引时,mysql会将多个索引合并到一起
- range:按指定范围(如 in,<,>,between,and等,但是前提是此字段要建立索引)来检索
- index: 全索引扫描,通常比All快,因为索引文件通常比数据文件小
- all :全表扫描,多数情况下需要优化
possible_keys
可能使用到的索引
key
实际使用的索引
key_len
索引字段的长度
ref
列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
rows
扫描的行数
filtered
按表条件过滤的行百分比
extra
- using index:使用了覆盖索引(Covering Index),即通过索引就能返回结果,无需访问表
- using where:查询使用了where 语句来处理结果
- using join buffer:获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果
- using filesort:这是 order by 语句的结果。这可能是一个CPU密集型的过程。using filesort表示出现了文件内排 序,表示很不好的现象,必须要优化,特别是大表,可以通过选择合适的索引来改进性能,用索引来为查询结果排序
- using temporary:mysql需要创建一张临时表来保存中间结果。 也就是说,需要先把数据放到临时表中,然后从临时 表中获取需要的数据。出现这种临时表,也是必须需要优化的地方,特别是数据量大的情况。两个常见的原因是在来自 不同表的列上使用了distinct,或者使用了不同的 order by 和 group by 列