exists和in比较

1、exists和in的区别

存在表A和表B

A_id A_name A_type
B_id B_name B_type

其中表A和表B的A_id和B_id均加了索引,其他的两个字段未加索引,A表记录10000条,B表记录有50000条

执行select * from A where A_id in (select B_id from B),此时的处理逻辑可以等效为两层for循环,则循环次数是10000*50000次,in操作是在内存中进行。

执行select * from A where A_id exists (select 1 from B where A_id = B_id),此时的处理逻辑等效为,A表的每一条记录,都需要去B表中查询,查询条件是select 1 from B where B_id  = A_id,在B表中存在则返回True,不存在返回False,因为A表有10000条记录,则需要数据库查询10000次

区别在于,in 是在内存中进行hash连接,与表join类似;exists是将A表的每一条数据循环在B表中查询。

2、exists和in的使用场景

从上面可以知道,exists的性能和A表数据量有很大关系,查询次数为A.size,若B表的查询条件字段加了索引,不论B表的数据量大不大,速度都是很快的,所以若A表(前表)的数据量较少,B表的数据量很大且查询字段加了索引,推荐使用exists。

当A表的数据量很大,B表的数据量较少,此时A表的查询条件字段加了索引,则推荐使用 in 。

A表和B表的数据量都较少时,exists和in没有太大区别,可以随意使用。

 

posted @   浪迹天涯的派大星  阅读(366)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示