关乎mysql数据库的连接查询和子查询的效率问题

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

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( '', '张', '%' ) 

       下面是查询结果:

       

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

      

       ②使用子查询

	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 '张%'
	

       下面是查询结果

        

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

      

    测试总结:

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

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

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

     总结:

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

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

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

     关于子查询的小拓展:

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

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

猜你喜欢

转载自blog.csdn.net/qq_20594019/article/details/111474641
今日推荐