去重以及 exists和in的效率对比

exists  主要是用作 一对一 或者 一对多的 情况下

什么是一对一,或者一对多呢

比如 现在有两个表 部门表,以及员工表。
部门表一般都是唯一的,而员工表 就存在 多个员工对应一个部门的情况。
在这种情况下,部门表 对 员工表就是一对多的关系。




select * from  A where exists(select 1 from B where A.id=B.a) ;

当B表数据较大时不适合使用in(),因为它会B表数据全部遍历一次.
如:A表有10000条记录,B表有1000000条记录,那么最多有可能遍历10000*1000000次,效率很差.
再如:A表有10000条记录,B表有100条记录,那么最多有可能遍历10000*100次,遍历次数大大减少,效率大大提升.

结论:in()适合B表比A表数据小的情况


exists()会执行A.length次,它并不缓存exists()结果集,因为exists()结果集的内容并不重要,重要的是结果集中是否有记录,如果有则返回true,没有则返回false.
当B表比A表数据大时适合使用exists(),因为它没有那么遍历操作,只需要再执行一次查询就行.
如:A表有10000条记录,B表有1000000条记录,那么exists()会执行10000次去判断A表中的id是否与B表中的id相等.
如:A表有10000条记录,B表有100000000条记录,那么exists()还是执行10000次,因为它只执行A.length次,可见B表数据越多,越适合exists()发挥效果.
再如:A表有10000条记录,B表有100条记录,那么exists()还是执行10000次,还不如使用in()遍历10000*100次,因为in()是在内存里遍历比较,而exists()需要查询数据库,我们都知道查询数据库所消耗的性能更高,而内存比较很快.


以上总结就是

 (1). select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;

         T1数据量小而T2数据量非常大时,T1<<T2 时,(1)的查询效率高。

    (2). select * from T1 where T1.a in (select T2.a from T2) ;

          T1数据量非常大而T2数据量小时,T1>>T2 时, (2) 的查询效率高。




去重



一对一或者一对多去重的话,可以使用 exists  也可以 使用group by 



但是 不是  一对一或者一对多去重的话  ,优化就要使用 group by  了
或是使用  min(rowid)   


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值