何为explain?
mysql explain的功能 : 获取select的相关信息 (点我查看)
注:explain 的别名 desc
-----------------------------------------------------------------------------------------------------
语法结构:
explain 你的表名 此语句 等同于 show columns from 你的表名
或
explain 你的查询sql语句
注:只能用于你的查询语句,不用怀疑,我试过了insert、delete、update 均大爷的报错~
例:explain select * from score_major;
-----------------------------------------------------------------------------------------------------
用法指南:
以下采集于myqsl官网描述:

粗略理解:就是查看你select语句的索引使用情况,语句扫描的行数,关联查询的扫描方式等等。
-----------------------------------------------------------------------------------------------------
一步一步深入研究:
执行 explain select * from university;
会返回该表的一行数据(10列)
myqsl官网描述:

-----------------------------------------------------------------------------------------------------
这神秘的10列:
1. id (没啥好说的、查询序号而已,无需大惊小怪)
2. select_type(你使用的查询类型,也许mysql的查询种类就这些吧)
2.a SIMPLE(简单的查询,一个普通的select * from tableName就是这样的类型)
-------------------------------------------------------------------------------------------
2.b PRIMARY(最外面的查询)
例子:
一个很普通的子查询,执行后 会返回2列 其中查询序号为1的查询类型就是PRIMARY即最外面(最后)的查询
explain
select t.id,t.uni_code,t.uni_name // ------> 最外面(最后的)查询
from (select * from university) as t; // ------> 另一种查询类型,此处先忽略掉
-------------------------------------------------------------------------------------------
2.c DERIVED (FROM子句的子查询)
例子:为了省略字符数,引用2.b的例子
查询序号1 的 为 PRIMARY 最外的查询
查询序号2 的 就是 DERIVED了! 即子查询
-------------------------------------------------------------------------------------------
2.d UNION(UNION查询中的第二个或后面的select查询)
小知识:何为 UNION查询?
解读:

例子:
explain
select id from university where id = 1 // 此查询类型为 PRIMARY
union (all)
// 是使用 union 或 union all 查询类型都为 UNION
select uni_id from uni_attrs where uni_id = 1; // 此查询类型即为 UNION
-------------------------------------------------------------------------------------------
2.e DEPENDENT(中文译为依赖) UNION(UNION中的第二个或后面的SELECT语句)
从中文解读译为 依赖的union 即 union是被依赖的 也就是 该union被作为子查询所使用(@ _ @)
例子:
explain
select id from university // 此查询类型为 PRIMARY
where id in (
select id from university where id = 1
//
另一种查询类型,此处先忽略掉
union select id from // 此查询类型为 DEPENDENT UNION 第二个查询
);
-------------------------------------------------------------------------------------------
2.f DEPENDENT SUBQUERY(和上面的很相似哦~ 子查询中的第一个SELECT)
例子:
引用2.e的例子,
查询序号1 为 PRIMARY
查询序号2 即为 DEPENDENT SUBQUERY
查询序号3 为 刚刚讲过的 DEPENDENT(依赖)UNION
-------------------------------------------------------------------------------------------
2.g UNION RESULT(UNION的结果)
例子:
2.e || 2.f
不知道大家有没有注意到,在运行 2.e 和 2.f 的例子上,都会有一个序号为null的行,类型就是 UNION RESULT
-------------------------------------------------------------------------------------------
2.h SUBQUERY(中文译为子查询)(和2.f的很相似哦~ 子查询中的第一个SELECT)
例子:
explain
select id from university // 此查询类型为 PRIMARY
where id > (
select id from university where id = 1 // 此查询类型为 SUBQUERY
);
注意:此例子 与 2.f 的例子很相像,不同的原因可能(个人理解)为:
本例中的子查询结果为指定的某一条记录,而2.f的子查询结果为多条记录
呼呼...一共8种查询类型,你都掌握了么?
掌握了就请休息会儿~再继续,没掌握的话把SQL语句执行一下就清楚啦^_^
3. table(输出的行所查询的表)
这没啥多说的了吧、
4. type(联接类型)
又是一个重要的列!一共11个种类,从最佳类型到最坏类型的排序为:
system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
so、一个一个来讲解啥算最佳啥算最坏吧@_@
20140430 休刊,有时间再补充~ 敲敲代码去了
参考资料:
http://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html
http://dev.mysql.com/doc/refman/5.1/zh/optimization.html#explain
http://www.oicto.com/mysql-explain-show