首先我们来分别用in和exists写两个相同的语句:、
in:
select * from A sno where in (select sno from B);
exists:
select * from A a where exists(select sno from B b where a.sno=b.sno);
我们先对用in写的语句进行分析,首先执行应该是执行子查询,首先将学生会的sno查询出来将返回sno缓存起来,然后通过遍历student表将所有的sno与子查询语句查询到的学生会的sno比较,若相同则选出来,而exists则是将每一个student中的sno放到子查询中和学生会中的sno进行比较。
这里我们进行假设,
当A表有100条数据,B表有10条数据时:
使用in会将B表里的10条数据先查出来,然后缓存起来。然后再将A表中的100条数据和缓存中的10条数据一一比较。
而使用where则是将A表中的100条数据,放到子查询语句中,依次比较是否相同,也就是说这时相比使用in,where多了99次进入B表查询的时间。
所以,可以得出结论当B表比A表小的时候用in的效率更高。
而当A表有10条数据,B表有100条数据时:
使用in会将B表里的100条数据先查出来,然后缓存起来。然后再将A表中的10条数据和缓存中的10条数据一一比较。
而使用where则是将A表中的10条数据,放到子查询语句中,依次比较是否相同。
这时我们使用in的时候会将100条数据进行缓存,而使用where则不用缓存。当B表大于A表时缓存的时间会大于进入B表查询的时间;所以这个时候使用where的效率更高。
综上:当A表大于B表时使用in效率更高,而B表大于A表时使用where效率更高。