mysql中exists 和 in的效率问题

in 使用于主表(e)比子查询表(d)大的情况下,效率更好
exists使用于主表(e)比子查询表(d)小的情况下,效率更好


例:
语句(1)SELECT * FROM emp e WHERE e.deptno IN (SELECT d.deptno FROM dept d);

语句(2)SELECT * FROM emp e WHERE EXISTS(SELECT d.deptno from dept d WHERE e.deptno=d.deptno );

1/      如语句(1),其实在in()查询子表时,做的时将子表d中所有的deptno全部遍历一遍并缓存在一张表中,检查e表的deptno是否与d表的deptno相等,如果相等就把记录加入到结果集,直到遍历完e表记录。
      及这个过程如同进行了两个for循环的过程,如果前表有10000条数据而后表有1000000条数据,则最差要遍历10000*1000000次,而d表数据少时,效率还是可以的,因为主表e必须遍历去查找,所以效率和d表(子表)数据多少有关。


2/      而exists,它只经历一次遍历操作,它只做判断e表deptno与d表数据deptno,无论如何,它的判断只执行e.length()次,所以在a表较小,或e表比的d表小时,都很实用。
而且in使用缓存,而exists则要去查询数据库,查询数据库能耗更高,占用内存更快。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值