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 @ 2022-03-31 13:54  浪迹天涯的派大星  阅读(584)  评论(0)    收藏  举报