执行计划Explain
# 1 type列
表示关联类型或访问类型,即MySQL决定如何查找表中的行
依次从最优到最差分别为 : system > const > eq_ref > ref > range > index > ALL
一般来说,得保证查询达到range级别,最好达到ref
system:表中只有一条数据,这个类型是特殊的const类型
const:针对主键或唯一索引的等值查询扫描,最多只返回一行数据,const查询速度非常快,因为它仅仅读取一次即可。
eq_ref:此类型通常出现在多表的join查询,表示对于前表的每个结果,都只匹配到后表的一行结果,并且查询的比较操作通常是=,查询效率高。这可能是在 const 之外最好的联接类型了,简单的 select 查询不会出现这种 type。什么情况下结果集只有一个呢!那便是使用了主键或者唯一性索引进行查找的情况
ref:相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。
range:范围扫描通常出现在 in(), between ,> ,<, >= 等操作中。使用一个索引来检索给定范围的行。
index:表示全索引扫描(full index scan),和ALL类型类似,只不过ALL类型是全表扫描,而index类型则仅仅扫描所有的索引,而不扫描数据。通常比ALL快一些。
all:表示全表扫描,这个类型的查询是性能最差的查询之一,通常来说,我们的查询不应该出现ALL类型的查询,因为这样的查询在数据量大的情况下,对数据库的性能是巨大的灾难,一般可以用索引来避免
# 2 possible_keys列
possible_keys表示mysql在查询时,能够使用到的索引,注意,即使有些索引在possible_keys中出现,但是不表示此索引会真正被Mysql使用到,Mysql在查询时具体使用了哪些索引,由key字段决定。
# 3 key列
此字段是mysql在当前查询时所真正使用到的索引。
# 4 key_len列
表示查询优化器使用了索引的字节数,这个字段可以评估组合索引是否完全被使用,或只有最左部分字段被使用到。根据数据类型所占字节数计算出来。
# 5 rows列
rows也是一个重要的字段,mysql查询优化器根据统计信息,估算SQL要查找到结果集需要扫描读取的数据行数。这个值非常直观显示SQL的效率好坏,原则上rows越少越好。