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没有太大区别,可以随意使用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通