Explain作为MySQL最常用的性能分析工具,这里记录一下每个列的作用。
因为涉及的列太多,这里主要记录一下常用的列的作用。
Explain select * from student
+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
| 1 | simple |student| ALL | null | null | null | null | 9636 | null |
+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
1、id
在查询语句中,每一个select关键字都对应唯一的一个id
- 只有一个id的情况
select * from student where name='***'
select s.name,c.name from student s left join class c on s.cid=c.id
对于连接查询来说,一个SELECT关键字后边的FROM子句中可以跟随多个表,所以在连接查询的执行计划中,每个表都会对应一条记录,但是这些记录的id值都是相同的
2. 存在多个id的情况
select * from class where id in(select cid from class)
select * from student union select * from student2
查询优化器可能对涉及子查询的查询语句进行重写,从而转换为连接查询,此时只有一个id,所以,如果我们想知道查询优化器是否对子查询进行了重写,直接看id是否包含多个就行了
2、select_type
SIMPLE:查询语句中不包含UNION或者子查询的查询都算作是SIMPLE类型,连接查询也是SIMPLE类型PRIMARY:对于包含UNION、UNION ALL或者子查询的大查询来说,它是由几个小查询组成的,其中最左边的那个查询的select_type值就是PRIMARYUNION:对于包含UNION或者UNION ALL的查询语句来说,他是由几个小查询组成,除了最左边的小查询,其他的小查询的select_type都是UNIONUNION RESULT:MySQL选择使用临时表来完成UNION查询的去重工作,针对该临时表的查询的select_type就是UNION RESULTSUBQUERYDEPENDENT SUBQUERYDEPENDENT UNIONDERIVEDMATERIALIZEDUNCACHEABLE SUBQUERYUNCACHEABLE UNION
3、table
每一个select语句可能涉及多个单表访问方法,table列的值就是对应每一个单表访问的表名
4、type
常用的列,我们前边说过执行计划的一条记录就代表着MySQL对某个表的执行查询时的访问方法,其中的type列就表明了这个访问方法
system:当表中只有一条记录并且该表使用的存储引擎的统计数据是精确的,比如MyISAM、Memory,那么对该表的访问方法就是system。const:当我们根据主键或者唯一二级索引列与常数进行等值匹配时,对单表的访问方法就是const
EXPLAIN select * from student where id=10
eq_ref:在连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的(如果该主键或者唯一二级索引是联合索引的话,所有的索引列都必须进行等值比较),则对该被驱动表的访问方法就是eq_ref
EXPLAIN SELECT * FROM s1 INNER JOIN s2 ON s1.id = s2.id;
ref:当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法就可能是reffulltext:全文索引ref_or_null:当对普通二级索引进行等值匹配查询,该索引列的值也可以是NULL值时,那么对该表的访问方法就可能是ref_or_nullindex_merge:索引合并unique_subqueryindex_subqueryrange:如果使用索引获取某些范围区间的记录,那么就可能使用到range访问方法
EXPLAIN select * from student where age>16 and age<18
index:当我们可以使用索引覆盖,但需要扫描全部的索引记录时,该表的访问方法就是indexALL:全表扫描
5、possible_keys
在某个查询语句中可能用到的索引,在mysql中,如果一个查询语句中包含多个索引,查询优化器会计算使用不同索引的成本,然后选择成本最小的索引来执行查询,possible_keys列中的值并不是越多越好,可能使用的索引越多,查询优化器计算查询成本时就得花费更长时间,所以如果可以的话,尽量删除那些用不到的索引
6、key
实际使用到的索引
7、key_len
实际使用到的索引列的长度
8、ref
9、rows
该查询语句预计扫描的记录行数