mysql中sql语句explain(一)

2015-01-22 20:53:37 · 作者: · 浏览: 2

?

explain是用来分析mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

1. id

语句的执行顺序标识。是指select语句执行的顺序

2、select_type:

2.1、simple

简单类型,只要 语句中没有子查询或union。

?

EXPLAIN SELECT * FROM `fm_company`

?

2.2 primary

最外面的select,在有子查询的语句中,最外面的select查询就是primary。查询关键字和主键无关

?

EXPLAIN SELECT * FROM `fm_company` AS t1 WHERE orgId IN(SELECT orgId FROM fm_company AS t2 WHERE t2.`id` = 1)

\

2.3 union

?

union语句的后面那个 select 执行执行语句。

?

EXPLAIN SELECT * FROM `fm_company` AS t1 
UNION
SELECT * FROM `fm_company` AS t2

2.4 dependent subquery

子查询中内层中第一个select语句。

?

?

EXPLAIN SELECT * FROM `fm_company` AS t1 WHERE orgId IN(SELECT orgId FROM fm_company AS sub_t1 WHERE sub_t1.`id` = 148)

2.5、devived

派生表(中间表)的查询语句

EXPLAIN  SELECT  * FROM (

SELECT * FROM `fm_company` AS t1 
UNION
SELECT * FROM `fm_company` AS t2
)  subQuery

2.6、dependent union

子查询中union且为union中第二个select开始的后面所有select,依赖于外部的结果集。

EXPLAIN SELECT *?
FROM `fm_company` as t1?
WHERE orgId IN(
SELECT orgId FROM fm_company as sub_t1 WHERE sub_t1.`id` = 148?
union?
SELECT orgId FROM fm_company AS sub_t2 WHERE sub_t2.`id` = 149
)

2.7 union result

顾名思义就是 union中合并的结果

?

?

3. table


显示这一步所访问的 数据库中表的名称

4. type

这列很重要,显示了连接使用了哪种类别,有无使用索引。type代表查询执行计划(QEP)中指定的表使用的连接方式。从最好到最差的连接类型为

4.1.system

system为const一个特例,即表中只有一条记录。这个是及特殊的情况

4.2.const

const是在where条件以常量作为查询条件,表中最多有一条记录匹配。由于是常量,所以实际上只需要读一次。

const用于比较primary key 或者unique索引。因为只匹配一行数据,所以很快

记住一定是用到primary key 或者unique,并且只检索出两条数据的 情况下才会是const。如下面这个sql。直接用主键id 查找

?

 EXPLAIN SELECT * FROM fm_company WHERE id=148

?

4.3. eq_reg

最多只会有一条匹配结果,一般是通过主键或是唯一索引来访问。一般会出现在连接查询的语句中。
mysql手册是这样说的:"对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY"。eq_ref可以用于使用=比较带索引的列
 EXPLAIN SELECT * FROM fm_company t1  ,fm_company t2  WHERE t1.id=t2.id

后面有时间再研究吧。
4. ref、5. range、6.index、7. all

?