1 In or的效率说明
IN 的作用相当与OR,如语句: Select * from table1 where tid in (2,3) 和 Select * from table1 where tid=2 or tid=3 是一样的,都会引起全表扫描,如果 tid 上有索引,其索引也会失效。
Sqlserver数据库中 in=or的执行效率一样。
针对其它数据库 in的执行效率比or高。(多家之言)
in or 都可以自动过滤重复数据。 即一条记录只显示一次。
2 In exists
常量数值范围 用 in ,子查询范围 用 in 或 exists。
针对子查询的构建,存在效率问题。
如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标。
exists()后面的子查询被称做相关子查询,他是不返回列表的值的.只是返回一个ture或false的结果,其运行方式是先运行主查询一次,再去子查询里查询与其对应的结果。
如果是ture则输出,反之则不输出。
in()后面的子查询是返回一个结果集的。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:应该灵活使用in,而不能直接就把IN关键字给完全抛弃不用。要根据操作的数据情况来看。
例如:表A(小表),表B(大表)
select * from A where cc in (select cc from B)
效率低
select * from A where exists(select 1 from B where B.cc=A.cc)
效率高
而
select * from A where cc in (‘1’,‘2’),就没有太大的必