explain字段说明
在需要执行的sql语句前面加上 explain 可以模拟优化器对语句的执行过程。
示例说明: explain select * from sys_user;
explain会返回1条或多条数据,下面解释各列含义:
1、 id 执行顺序。
这是一个相对大小,表示各条语句执行的先后顺序,越大越先执行,id相同时从上到下执行。另外在union查询时,外层的union结果语句的id为null,同时这一行的table列会是<unionM,N>的形式,表示引用 id 值为 M 和 N 的行的并集。
explain select realname from sys_user
union select par_name from sys_param
先查询sys_param表,然后查询sys_user表,最后将1和2的结果进行并集。第三行union1,2对应上面id=1和id=2的两条查询
2、 select_type 查询类型。
下面列举常见的几种值
- SIMPLE 简单查询,没有union和子查询
- PRIMARY 最外层查询
- 有子查询的情况下,最外层的查询就是PRIMARY。在union 语句中,第一个查询也是PRIMARY,如上图。注意它不是主键查询,跟主键没关系
- UNION union查询中,第二个以及之后的查询标记为UNION
explain select realname from sys_user
union select par_name from sys_param
- DEPENDENT UNION
依赖于外部查询的union语句中, 第二个以及之后的查询标记为DEPENDENT UNION。 - DEPENDENT SUBQUERY 依赖于外部查询的子查询中第一个查询
这里的依赖外部查询是指什么呢,就是说他本身是一个子查询,但是它引用了外部查询中的某个表。
- UNION RESULT UNION的结果,一般id为null
典型示例:
explain select
u.USER_USERNAME
from SYS_USER u
where exists (select UR_ROLE_ID from SYS_USER_ROLE where UR_USER_ID= u.USER_USERNAME
union select ORG_NAME from SYS_ORGANIZATION org
where org.ORG_CODE = u.USER_ORGANIZATION_CODE)
- SUBQUERY select子句或者where条件里的子查询(当然这个子查询不是依赖于外部查询的)
explain select
u.USER_USERNAME,(SELECT max(ORG_NAME) from SYS_ORGANIZATION org1 w