前言:正常情况下,连接查询是比子查询效率要高的,因为子查询需要创建临时表。但是,在实际测试中,有部分情况子查询效率会比连接查询要高

1:去重的情况下

        ①连接查询

SELECT
	DISTINCT itm.team_id 
FROM
	表1 itm
	LEFT JOIN 表2 itmc on itm.team_id=itmc.team_id
WHERE
	itmc.up_start = !1 
	AND itmc.check_state = !1
	AND itm.NAME LIKE CONCAT( '', '张', '%' )

       下面是查询结果:

       

MySQL查询子节点ID mysql子查询和连接查询效率_子查询

        使用explian查看语句,发现都使用了索引,是我们想要的效果(使用索引)

      

MySQL查询子节点ID mysql子查询和连接查询效率_mysql_02

       ②使用子查询

SELECT
	  DISTINCT itm.team_id 
FROM
	表1 itm ,
	(select DISTINCT itmg.team_id from 表2 itmg where itmg.up_start != 1 AND itmg.check_state != 1) tab_a
	where  
 itm.team_id = tab_a.team_id
 and itm.NAME LIKE '张%'

       下面是查询结果

        

MySQL查询子节点ID mysql子查询和连接查询效率_数据库_03

       使用explian查看语句,发现主表和副表也都使用了索引

      

MySQL查询子节点ID mysql子查询和连接查询效率_MySQL查询子节点ID_04

    测试总结:

              1:查询的结果是一致的,如果没有加去重的话,两个sql语句,连接查询效率相对高一些

              2:现在两个查询语句都使用了去重,连接查询效率却比子查询效率低得多

                    分析:个人认为这是由于去重的原因,连接查询去重机制是将两张表中符合条件的数据先筛选出来,然后再去重;但是子查询相当于去重了两遍,副表中筛选了一次以后,数据量小了很多,这时候再去跟主表中的数据匹配,再去重,工作量小了很多,                      所以查询效率高了很多

     总结:

             1:在正常情况下,我还是坚持认为连接查询较好,子查询首先可读性就比较差,维护成本比较高,同时子查询也会建立临时表浪费资源

             2:像上面的那种情况确实给我们启示,某些特殊情况下,子查询确实有用武之地,也不应该一味排斥

             3:像上面的那种查询需求,其实在设计之初如果能够考虑到这种应用场景的话,不至于像现在这样难办,所以表设计还是核心

 

     关于子查询的小拓展:

           1:子查询可以放在很多地方,比如select,from,where后面,但是不能放在group by后

           2:如果放在select后面,会造成多次执行子查询语句,外查询每次执行一次,都会执行一次子查询(不知道我理解的对不对,希望有同学能够指正我的错误!)