失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 关乎mysql数据库的连接查询和子查询的效率问题

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

时间:2020-06-19 10:08:36

相关推荐

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

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

1:去重的情况下

①连接查询

SELECTDISTINCT itm.team_id FROM表1 itmLEFT JOIN 表2 itmc on itm.team_id=itmc.team_idWHEREitmc.up_start = !1 AND itmc.check_state = !1AND itm.NAME LIKE CONCAT( '', '张', '%' )

下面是查询结果:

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

②使用子查询

SELECTDISTINCT 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_awhere itm.team_id = tab_a.team_idand itm.NAME LIKE '张%'

下面是查询结果

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

测试总结:

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

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

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

总结:

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

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

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

关于子查询的小拓展:

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

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

如果觉得《关乎mysql数据库的连接查询和子查询的效率问题》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。