Mysql Explain命令笔记
用法
EXPLAIN <SQL语句>
EXPLAIN SELECT * FROM TBL_TEST WHERE ID=123;
使用explain命令可以查看某个SQL语句的执行过程,查看该SQL是否有用到索引,使用索引的方式,有没有作全表扫描,排序的时候有没有使用临时表等,对于SQL优化点的排查有很好的帮助。
输出
±-----±------------±---------±-----±--------------±--------------±--------±------------±-----±----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
±-----±------------±---------±-----±--------------±--------------±--------±------------±-----±----------------------+
| 1 | SIMPLE | TBL_TEST | ref | KEY_COL1_COL2 | KEY_COL1_COL2 | 206 | const,const | 1 | Using index condition |
±-----±------------±---------±-----±--------------±--------------±--------±------------±-----±----------------------+
- id为sql的执行顺序,由大到小,上到下的顺序执行
- select_type有以下几种类型:
(1) SIMPLE
简单SELECT(不使用UNION或子查询等) 例如:
(2). PRIMARY
最外层的select
(3).UNION
UNION中的第二个或后面的SELECT语句
EXPLAIN SELECT * FROM TBL_TEST WHERE ID=123 UNION ALL SELECT * FROM TBL_TEST;
±-----±------------±---------±-----±--------------±-----±--------±-----±-----±------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
±-----±------------±---------±-----±--------------±-----±--------±-----±-----±------------+
| 1 | PRIMARY | TBL_TEST | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
| 2 | UNION | TBL_TEST | ALL | NULL | NULL | NULL | NULL | 2 | |
±-----±------------±---------±-----±--------------±-----±--------±-----±-----±------------+
(4).DEPENDENT UNION
UNION中的第二个或后面的SELECT语句,取决于外面的查询
EXPLAIN SELECT * FROM TBL_TEST WHERE ID IN (SELECT ID FROM TBL_TEST UNION ALL SELECT ID FROM TBL_TEST);
±-----±-------------------±---------±-----±--------------±-----±--------±-----±-----±------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
±-----±-------------------±---------±-----±--------------±-----±--------±-----±-----±------------+
| 1 | PRIMARY | TBL_TEST | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
| 2 | DEPENDENT SUBQUERY | TBL_TEST | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
| 3 | DEPENDENT UNION | TBL_TEST | ALL | NULL | NULL | NULL | NULL | 2 | Using where |
±-----±-------------------±---------±-----±--------------±-----±--------±-----±-----±------------+
(4).UNION RESULT
UNION的结果。
(5).SUBQUERY
子查询中的第一个SELECT.
(6). DEPENDENT SUBQUERY
子查询中的第一个SELECT,取决于外面的查询
(7).DERIVED
派生表的SELECT(FROM子句的子查询) - table字段,操作的表名
- type字段,这个字段很关键,用于阐述当前查询是属于哪种类型,是否使用索引、使用索引范围,连接类型为从好到差依次为:const>eq_ref>ref>range>index>ALL
system: 表只有一行或者为空
const: 使用唯一索引或者主键,返回记录一定是一条的等值where条件时,通常type是const
eq_ref: 使用唯一索引或者主键,此类型通常出现于多表的join查询,表示对于前表的每一个结果,都对应后表的唯一一条结果。并且查询的比较是等值操作,查询效率比较高。
ref可能找到多个符合条件的行,有三种情况:- 非主键或者唯一键的等值查询
- join连接字段是非主键或者唯一键
- 最左前缀索引匹配
range: 索引范围扫描,常用于><,is null,between,in,like等
index:扫描全表索引,通常比All快一些
ALL:全表扫描,没有使用索引
- possible_keys字段,显示select可能会使用的列
- key字段,此次查询所用到的索引key,没有则为NULL
- key_len字段,该查询计算使用的索引长度,在不损失精度情况下长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,并不是通过表内检索出的。
- ref字段,这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有: const(常量),字段名等。一般是查询条件或关联条件中等号右边的值,如果是常量那么ref列是const,非常量的话ref列就是字段名。
- row字段,表明此次查询过程中需要读取并检测的行数
- Extra字段,额外信息
Using index——只扫面索引可以直接得到结果(结果集字段是索引)
Using index condition——查询的列索引不完全覆盖(结果集的字段不全是索引)
Using where——索引只用来执行定位,结果集需要查询对应数据行
Using temporary——结果需要创建临时表处理,此类查询特别消耗资源
Using filesort——排序使用外部排序,并不在内存中,此类排序效率很低消耗大量IO