explain执行计划分析,是SQL优化的重要手段。
id
id表示查询中执行 select 子句或操作表的顺序。id的执行顺序规则:
- id越大,越先执行。
- id相同,则按从上到下顺序执行。
id相同
EXPLAIN SELECT * FROM employee e ,department d ,customer c
WHERE e.cus_id = c.id AND e.dep_id = d.id ;
id不同
EXPLAIN SELECT * FROM department
WHERE id = ( SELECT id FROM employee WHERE id =( SELECT id FROM customer WHERE id = 1 ));
EXPLAIN SELECT * FROM department d, (SELECT dep_id FROM employee GROUP BY dep_id) t
WHERE d.id = t.dep_id;
select_type
- simple:简单查询,不含子查询、UNION
- primary:复杂查询的最外层查询
- subquery:子查询
- derived:当from后包含子查询时,标记为derived–临时表
- union:union之后的标记位union,前面的是primary
type 访问类型
- system:系统只有一条记录,不会出现。memory引擎
- NULL: 不走表。例如
select now();
- const:通过主键或者唯一索引,定位到一条数据
- eq_ref:使用主键或者唯一性索引扫描,只能匹配一行。多用于多表join操作。
EXPLAIN SELECT * FROM employee e , department d WHERE e.id = d.id;
- ref:非唯一性索引的单值扫描。
- range:索引的范围查找(>,>=,in等)
- index:扫描索引树(基于索引的全表扫描,先扫索引,再扫表)
- all:全表扫描
type 最好能达到index之上。
下图中,age是普通索引,age=18时,表中有多条数据,访问类型为all,没有走索引;当age=22,表中只有一条数据时,访问是ref。
possible_keys
表示查询时可能使用到的索引,并不是真正用到。
key
表示查询时真正使用到的索引,显示索引字段名称。
rows
查询优化器根据统计信息估算查询到结果需要扫描多少行数据。rows越少效率越高。
key_len
查询使用了索引的字节数据量。可以判断是否全部使用了组合索引,或者只用到索引最左部分字段。
Extra属性
查询的额外信息:using where/index/filesort/tempropary 等很多。