现在两个表`user`和`user_role`表:
user:
user_role:
1. 现在需要用 exists 作用子查询来查`user`表
mysql> select * from user t where exists (select * from user_role r where t.id = r.user_id);
2. 我们也可以用 in 来 查询`user`表
mysql> select * from user t where t.id in (select r.user_id from user_role r);
什么时候用 exists?什么时候用 in ?
不管是1,还是2,都要查`user`表的全部,所以主要看`user_role`表,
对于1,exists子查询,每次都需要根据`user`表的id去查询`user_role`表;
对于2,in子查询,mysql其实是在内存中匹配`user`表的id,匹配到的话则返回该条记录,所以mysql会根据
select r.user_id from user_role r
查出`user_role`表的所有user_id,它只查出一次,然后就在内存中做匹配了,所以说,如果user_role表比较小的话,那么使用 in 子查询是快于 exists 子查询的,如果user_role表数据比较大的话,还是使用exists较快的。
3. not in 和 not exists
如果子查询中使用not in,那么内外表都进行全表扫描,没有用到索引;
而使用not exists时,查询还是会使用到索引,not exists会比not in好。