通过explain分析SQL
通过explain分析SQL
数据库会先进行计划分析,再进行查询。执行计划从侧面反映了SQL的执行效率,那么通过explain查看并分析执行计划是非常有必要的
mysql> explain select * from lm_d_plan group by fk_deptno;
+----+-------------+-----------+-------+---------------+-----------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+-------+---------------+-----------+---------+------+------+-------+
| 1 | SIMPLE | lm_d_plan | index | FK_deptNo | FK_deptNo | 99 | NULL | 5416 | NULL |
+----+-------------+-----------+-------+---------------+-----------+---------+------+------+-------+
1 row in set (0.00 sec)
explain解析:
1. select_type:
SIMPLE:简单SELECT(不使用UNION或子查询等)
PRIMARY:我的理解是最外层的select
UNION : UNION中的第二个或后面的SELECT语句
DEPENDENT UNION : UNION中的第二个或后面的SELECT语句,取决于外面的查询
UNION RESULT : UNION的结果
SUBQUERY : 子查询中的第一个SELECT
DEPENDENT SUBQUERY : 子查询中的第一个SELECT,取决于外面的查询
DERIVED:派生表的SELECT(FROM子句的子查询)
2. table:
显示这条sql涉及到的那些表,有时不是真实的表名字,看到的是derivedx(x是个数字,我的理解是第几步执行的结果)
3. type :
这是重要的列,显示连接是那种类型,从最好到最坏依次是:const(常数查找,主键或唯一索引查找),system:(这是const联接类型的一个特 例。表仅有一行满足条件),eq_reg: (范围查找,主键或者索引范围的查找),ref(常见连接查询,一个表是基于某个索引的查找),range(基于索引范围的查找),index(索引的扫 描),all(表扫描)
4. possible_keys :
显示可能用到的索引。如果为空,没有可以用到的索引
5. key :
实际使用的索引,如果为空则没有使用索引
6. key_len :
使用索引的长度,在不损失精确性的情况下,长度越短越好
7. ref:
显示索引的哪一列被使用了。如果可能的话,是一个常数。
8. rows :
mysql认为必须检查的用来返回数据的行数
9. Extra:
Using filesort 看到这个就需要优化了。mysql需要通过额外的步骤发现如何对返回行进行排序,他需要根据连接类型以及存储排序键值和匹配条件的所有行的行指针进行所有行排序,通常发生order by操作上。
Using temporary 看到这个就需要优化了,mysql需要建立临时表来存储结果,这通常发生在对不同的列集进行order by操作上,而不是group by操作。