A表数据数量为m,B表数据中和A有关的数据数量为n.
select * from A where A.id in(select B.aid from B) 先执行子查询,将结果放到内存中,在执行主查询进行条件筛选.缓存n条数据,再用m条数据进行条件筛选,筛选m*n次.
select * from A where exists( select 1 from B where B.aid = A.id)先执行主查询, 查出m条数据,再进行m次查询.
in:
for(int i = 0;i<m;i++){
for(int j = 0; j< n; j++){
return A[i].id==B[j].aid;
}
}
exist:
for(int i = 0;i<m;i++){
return execute(select 1 from B where B.aid = A[i].id);
}
若m=1,n=10000,则in需要在内存中循环遍历1*10000次,exist需要执行1次sql.
所以当n特别大时,用in内存会占用很多,用exist较好.
若m特别大,用in较好