SELECT * FROM A WHERE ID IN(SELECT ID FROM B)
SELECT a.* FROM A a WHERE EXISTS(SELECT 1 FROM B b WHERE a.ID=b.ID)
结论:
1、看表数据规模,A表>B表,使用in ;A表<B表,使用exists;
2、无论什么情况,not exist的效率都会比not in 高。
分析:
in :首先查出B表中的所有ID字段,放入内存中,然后遍历A表,将ID值相等的数据放入结果集;
exists:先查出A 表中所有字段,查询where条件看是否存在于B表中,存在则将该行结果放入结果集。exists需要查询数据库。
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。