我们来学mysql -- EXPLAIN之select_type(原理篇)
EXPLAIN之select_type
- 题记
- select_type
题记
- 书接上文《 EXPLAIN之ID》
- 2024美国大选已定,川普剑登上铁王座,在此过程中出谋划策的幕僚很重要,是他们决定了最终的执行计划
- 在《查询成本之索引选择》中提到,explain的输出,就是优化器(幕僚)选择的执行计划
- 除了SELECT开头的查询,DELETE、INSERT、UPDATE也都有执行计划,这里只关注SELECT
- 从输出的计划中可见很多字段,传达了什么样的信息,接下来看select_type
select_type
-
一条sql语句可包含多个select关键字, select_type标记每个小查询扮演了什么
-
SIMPLE
- 没有子查询,普通不过如此
select * from ucoding where k1 = 'Td621'
- 可以有JOIN连接,但不通过UNION连接
select * from ucoding JOIN icoding on k1 = i_k1 where mark = 'Td621'
- 没有子查询,普通不过如此
-
PRIMARY
- 包含UNION或UNION ALL, 由几个小查询组成,标记最左边的查询为PRIMARY
select * from ucoding where k3 ='tt'union select * from icoding where i_k3 ='tt'
- 包含子查询,由几个小查询组成,标记最左边的查询为PRIMARY
- 子查询在条件中
select * from ucoding where k1 in (SELECT i_k1 from icoding ) or k3 = 'a'
- 子查询在输出字段中
select * , (SELECT i_k1 from icoding WHERE i_k1 = ut.k1 ) from ucoding ut
- 包含UNION或UNION ALL, 由几个小查询组成,标记最左边的查询为PRIMARY
-
UNION
- 包含UNION或 UNION ALL,除了最左边,其余标记UNION
select * from ucoding where k3 ='tt' union select * from icoding where i_k3 ='tt'
- 包含UNION或 UNION ALL,除了最左边,其余标记UNION
-
UNION RESULT
- UNION使用临时表进行去重,标记临时表的查询为UNION RESULT,参考上图介绍
-
SUBQUERY
- 这简单,无非就是select查询穿插在一个“大”select中(非union连接 )
select * from ucoding where k1 in (SELECT i_k3 from icoding WHERE i_mark= 'tt' )
- 一看傻眼了,我的子查询呢!!!,凌乱
- 官方是这样说的
- 包含子查询的查询sql无法转为对应的半连接形式
- 并且子查询是不相关子查询
- 而且查询优化器决定将子查询物化来执行该子查询
- 接下来的领域,非无矩境的夫子才可踏入,尔等怎能看清这道法天象
- 所以,我等退下,现在知道了有这种情况即可
- 这简单,无非就是select查询穿插在一个“大”select中(非union连接 )