explain分析sql
mysql中可以使用explain命令来解析查询语句的性能,只需要在查询语句之前加上 explain 关键字即可。
接下来分别对结果中的每一个字段进行解析。
1)select_type select查询的类型
SIMPLE 表示此查询是一个不包含union和子查询的简单查询。
PRIMARY 表示此查询是最外层的查询
UNION 表示此查询是union的第二或随后的查询
SUBQUERY 子查询的第一个select
2)table 查询的是哪个表
3)type
该字段是判断查询是否高效的重要依据。通过type的类型,可以得知该查询是全表扫描还是索引扫描。
type的常用类型
system 表中只有一条数据,这个类型是特殊的const类型。
const 针对主键或唯一索引的等值查询扫描,最多只返回一行数据。const查询速度非常快,因为它仅仅读取一次即可。
eq_ref 此类型通常出现在多表的join查询,表示对于前表的每一个结果,都只能匹配到后表的一行结果,并且查询的比较操作通常是=,查询效率较高。
ref 此类型通常出现在join查询,针对非唯一或非主键索引,或者是使用了最左前缀规则索引的查询。
range 表示使用索引范围查询,通过索引字段范围获取表中部分数据记录。这个类型通常出现在=,>=,<=,between,in等操作中。
index 表示全索引扫描,仅仅扫描所有的索引就可以获取结果,而不用扫描数据。当这种情况时,extra字段会显示 using index。
ALL 表示全表扫描,这个类型的查询是性能最差的查询之一。通常来说,我们的查询不应该出现ALL类型的,因为这样在大数据量的情况下,对数据库的性能是巨大的灾难。