mysql explain命令分析sql语句性能

Updated on in 程序人生 with 0 views and 0 comments

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_

这个语句会产生如下信息

image.png

再来一个使用union的sql

eg:

EXPLAIN SELECT
	* 
FROM
	( ( SELECT * FROM org_relation LIMIT 11 ) UNION ( SELECT * FROM org_relation LIMIT 1 ) ) a

产生如下信息

image.png

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


标题:mysql explain命令分析sql语句性能
作者:wenyl
地址:http://www.wenyoulong.com/articles/2020/09/02/1598977415569.html