两种查询的区别
IN
select * from A where id in (select id from B);
此处select id from B只会执行一次,将所有数据缓存到内存,然后遍历A表中的每条数据进行判断是否存在。
EXIST
select * from A as a where exists(select id from B as b where a.id = b.id);
此处一条条取出A表中的数据,拿着每一条去遍历B表中的每一条数据,一旦找到一条符合条件,就返回true,那么A中这条id的数据就会被取出来。
效率
可以看出,如果B表比较小,那么适合用IN:
- 一次读取B表到内存,内存开销不大,内存效率高。
- 遍历总次数为A.length*B.length,因为B表比较小,遍历总次数没有那么夸张。
如果B表很大,那么适合用EXISTS:
- 不需要一次读取到内存,内存开销小
- 由于B表查询的时候有limit 1的效果,所以总的查询次数会大幅度减少。
ok?