
1、示例
使用explain语句可以分析查询语句
eg:explain select * from org_user t1 left join org_relation t2 on t2.user_id_ = t1.id_ left join org_group t3 on t2.group_id_ = t3.id_
这个语句会产生如下信息

再来一个使用union的sql
eg:
EXPLAIN SELECT
*
FROM
( ( SELECT * FROM org_relation LIMIT 11 ) UNION ( SELECT * FROM org_relation LIMIT 1 ) ) a
产生如下信息

2、结果分析
2.1、id
id是select的查询序列号
2.2 、select_type
select_type表示select语句的类型(dependent表示一个依赖关系,例如一个查询对子查询语句做了筛选操作,则子查询就依赖与外面的sql,子查询最终结果取决于外面的sql语句)
- simple表示一个不包含连接和子查询的查询
- primary表示主查询(最外层的查询)
- union表示union连接的第二个或后面的查询语句
- dependent union表示union连接的第二个或者后面的select语句,取决于外面的查询语句
- union result表示连接的结果
- subquery表示子查询中的第一个select语句
- dependent subquery表示子查询中的第一个select语句,取决于外面的查询语句
- derivedsql中from后,where前的子查询语句(就是查询产生的虚拟表)
2.3、table
查询的表(显示的时候,会使用别名)
2.4、type
连接的类型
- system 系统表,只有一行数据
- const数据表只有一个匹配行(根据一个条件只能查询到一个sql)
- eq_ref使用唯一索引或者这个索引是根据主键来建立
- ref查询了非唯一索引
- ref_or_null表示查询非唯一索引,并且处理了索引列为null的情况
- index_merge使用了多个索引作为查询条件(多个索引同时查询,然后做合并操作)
- unique_subquery子查询返回了不重复的唯一值(select * from a where a.id in(select id from b))
- index_subquery子查询使用了非唯一索引,并且将该列数据返回(select * from a where 字段 in(select 非唯一索引字段 from b))
- range对索引字段进行范围查询(>,<,,,)
- all对表的任意组合进行完整的扫描
- index只扫描索引树(一般索引文件比数据文件小,所以速度一般比all快)possible_keys
2.5、possible_keys
可能用来查询的索引列
2.6、key
实际使用的索引列
2.7、key_len
表示选择的索引字段按照字节计算的长度(主要用于判断mysql使用了多列索引中的几个字段)
2.8、ref
使用那个列或常数和索引一起作为查询条件
2.9、rows
查询扫描的行数
2.10、Extra
处理查询时的详细信息
3、describe
Describe使用和explan一样,可以缩写为desc