一、概述
在日常工作中,我们要看系统中有哪些慢SQL,会开启慢查询去记录一些执行时间比较久的SQL语句,但是这还没完,找到这些慢SQL后,我们要对这些SQL进行分析,比较常用的方法就是使用EXPLAIN去查看这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描等。上一期给大家介绍了EXPLAIN中id字段的含义,今天我们就带大家一起来学习后面的内容。
二、select_type
select_type表示查询中每个select子句的类型,主要有以下几种:
(1) SIMPLE(简单SELECT,不使用UNION或子查询等)
(2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
(3) UNION(UNION中的第二个或后面的SELECT语句)
(4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)
(5) UNION RESULT(UNION的结果,union语句中第二个select开始后面所有select)
(6) SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)
(7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询)
(8) DERIVED(派生表的SELECT, FROM子句的子查询)
(9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)
上一期的3个例子中,我们已经看到过了SIMPLE、PRIMARY、SUBQUERY、DERIVED,接下去我们再来看个UNION和UNION RESULT的例子
mysql> EXPLAIN SELECT * FROM t1
-> UNION
-> SELECT * FROM t2;
+----+--------------+------------+-------+---------------+------------+---------+------+------+-----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------+------------+-------+---------------+------------+---------+------+------+-----------------+
| 1 | PRIMARY | t1 | index | NULL | idx_t1_id2 | 9 | NULL | 9 | Using index |
| 2 | UNION | t2 | index | NULL | idx_t2_id2 | 23 | NULL | 10 | Using index |
| NULL | UNION RESULT | <union1,2> | ALL | NULL | NULL | NULL | NULL | NULL | Using temporary |
+----+--------------+------------+-------+---------------+------------+---------+------+------+-----------------+
3 rows in set (0.00 sec)
三、table
顾名思义,table表示的是这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的),有时不是真实的表名字,可能是简称,例如上面的<union1,2>以及上一期中的<derived2>,也可能是第几步执行的结果的简称。