目录
1、案例场景介绍
我们在实际开发过程之中,我们经常使用In条件来过滤记录;很多人在愁in与exist 之间的那个性能更好。但是in有个限定数量不能超过1000。
2、代码实现
2.1、in 与 exists关系
外表大,用IN;内表大,用EXISTS;
原理:
用in:外表使用了索引,直接作hash连接;
用exists:内表使用了索引,外表作loop循环再进行匹配;
2.2、not in与not exists
性能:not in不走索引,所以一般都用not exists;
区别:还有一点区别就是,not in字段为null的不进行筛选出来;而使用not exists即可;
这也就是说有时定义字段,用not null比较好了,这样也能避免not in查询出错。
3、总结
1、IN查询在内部表和外部表上都可以使用到索引;
2、EXISTS查询仅内部表上可以使用到索引,外表会全表扫描;当子查询结果集很大,而外部表较小的时候,EXISTS的Block Nested Loop(Block 嵌套循环)的作用开始显现,查询效率会优于IN;
3、当子查询结果集较小,而外部表很大的时候,EXISTS的Block嵌套循环优化效果不明显,IN 的外表索引优势占主要作用,此时IN的查询效率会优于EXISTS。子查询结果集越大用EXISTS,子查询结果集越小用IN