实战详解:selectType分析

文章详细解释了MySQL查询分析器中的select_type字段,包括SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION等类型,以及它们在查询中的作用和示例。通过示例查询演示了如何使用EXPLAIN来分析查询执行计划,强调了识别查询类型对于优化数据库性能的重要性。
摘要由CSDN通过智能技术生成

1.常见的selectType说明

select_type查询类型说明
SIMPLE简单的 select 查询,不使用 union 及子查询
PRIMARY最外层的 select 查询
SUBQUERY在select或者where中包含了子查询,子查询中的第一个 select 查询,不依赖于外部查询的结果集
DEPENDENT SUBQUERY子查询中的第一个 select 查询,依赖于外部 查询的结果集
DERIVED用于 from 子句里有子查询的情况。 MySQL 会递归执行这些子查询, 把结果放在临时表里。
UNIONUNION 中的第二个或随后的 select 查询,不 依赖于外部查询的结果集
DEPENDENT UNIONUNION 中的第二个或随后的 select 查询,依 赖于外部查询的结果集
UNCACHEABLE UNIONUNION 中的第二个或随后的 select 查询,属 于不可缓存的子查询

2.常见的selectType举例

  • SIMPLE:简单的 select 查询,不使用 union 及子查询
  • PRIMARY:也就是最后执行的语句
  • SUBQUERY:在select或者where中包含了子查询
  • DERIVED:临时表会增加MYSQL负担,但是有时候不得不用,类比:Java中两个变量交换数值
  • UNION:两个表的查询结果合并
mysql> EXPLAIN SELECT t1.id from t1 UNION SELECT t2.id from t2;
+----+--------------+------------+------+---------------+------+---------+------+------+-------+
| id | select_type  | table      | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+--------------+------------+------+---------------+------+---------+------+------+-------+
|  1 | PRIMARY      | t1         | ALL  | NULL          | NULL | NULL    | NULL |    3 |       |
|  2 | UNION        | t2         | ALL  | NULL          | NULL | NULL    | NULL |    3 |       |
| NULL | UNION RESULT | <union1,2> | ALL  | NULL          | NULL | NULL    | NULL | NULL |       |
+----+--------------+------------+------+---------------+------+---------+------+------+-------+
  • UNION RESULT:从合并的结果中进行再次查询
mysql> EXPLAIN SELECT t3.id from (SELECT t1.id from t1 UNION SELECT t2.id from t2)t3;
+----+--------------+------------+------+---------------+------+---------+------+------+-------+
| id | select_type  | table      | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+--------------+------------+------+---------------+------+---------+------+------+-------+
|  1 | PRIMARY      | <derived2> | ALL  | NULL          | NULL | NULL    | NULL |    3 |       |
|  2 | DERIVED      | t1         | ALL  | NULL          | NULL | NULL    | NULL |    3 |       |
|  3 | UNION        | t2         | ALL  | NULL          | NULL | NULL    | NULL |    3 |       |
| NULL | UNION RESULT | <union2,3> | ALL  | NULL          | NULL | NULL    | NULL | NULL |       |
+----+--------------+------------+------+---------------+------+---------+------+------+-------+

3.selectType使用总结:

  • selectType意义:select查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。
  • selectType作用:辨识查询的类型,调整查询方式

4.执行的SQL文件

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for t1
-- ----------------------------
DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1` (
  `id` int(5) DEFAULT NULL,
  `name` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of t1
-- ----------------------------
INSERT INTO `t1` VALUES ('1', 'downeyjr_1');
INSERT INTO `t1` VALUES ('2', 'downeyjr_2');
INSERT INTO `t1` VALUES ('3', 'downeyjr_3');

-- ----------------------------
-- Table structure for t2
-- ----------------------------
DROP TABLE IF EXISTS `t2`;
CREATE TABLE `t2` (
  `id` int(5) DEFAULT NULL,
  `name` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of t2
-- ----------------------------
INSERT INTO `t2` VALUES ('1', 'downeyjr_1');
INSERT INTO `t2` VALUES ('2', 'downeyjr_2');
INSERT INTO `t2` VALUES ('3', 'downeyjr_3');

-- ----------------------------
-- Table structure for t3
-- ----------------------------
DROP TABLE IF EXISTS `t3`;
CREATE TABLE `t3` (
  `id` int(5) DEFAULT NULL,
  `name` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of t3
-- ----------------------------
INSERT INTO `t3` VALUES ('1', 'downeyjr_1');
INSERT INTO `t3` VALUES ('2', 'downeyjr_2');
INSERT INTO `t3` VALUES ('3', 'downeyjr_3');
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MySQL中,EXPLAIN语句用于解释一条SQL查询语句的执行计划。其中,select_type是EXPLAIN输出结果的一列,表示查询的类型。根据引用和引用的信息,select_type可能有以下几种可能的值:SAMPLE、PRIMARY、UNION、DEPENDENT UNION、UNION RESULT、SUBQUERY、DEPENDENT SUBQUERY、DERIVED。 其中,SAMPLE表示从表中随机抽取数据进行查询,PRIMARY表示这是最外层的查询,UNION表示这是一个UNION操作,DEPENDENT UNION表示这是一个依赖于外部查询的UNION操作,UNION RESULT表示这是一个UNION操作的结果集,SUBQUERY表示这是一个子查询,DEPENDENT SUBQUERY表示这是一个依赖于外部查询的子查询,DERIVED表示这是一个派生表。 例如,当执行"explain select * from film"查询时,select_type的值为PRIMARY,表示这是最外层的查询。当执行"explain select * from users inner join orders where users.id = orders.user_id"查询时,select_type的值为SIMPLE,表示这是一个简单的表连接查询。当执行"explain select orders.*,(select product_name from products where id = 10001) from orders"查询时,select_type的值为SUBQUERY,表示这是一个包含子查询的查询语句。 总结起来,select_type用于表示查询的类型,包括SAMPLE、PRIMARY、UNION、DEPENDENT UNION、UNION RESULT、SUBQUERY、DEPENDENT SUBQUERY、DERIVED。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [explain之select_type](https://blog.csdn.net/banche163/article/details/103866014)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【mysql】explain执行计划之select_type列](https://blog.csdn.net/qq_32088869/article/details/130790765)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开源商城源码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值