一、exists与in的区别
exists与in都可以实现一个目的.二者都可以用来过滤数据.
exists,not exists一般都是与子查询一起使用.
In可以与子查询一起使用,也可以直接in (a,b.....)
写法不同, exists的where条件是: "...... where exists (..... where a.id=b.id)"
--in的where条件是: " ...... where id in ( select id .... where a.id=b.id)"
注意,一直以来认为exists比in效率高的说法是不准确的。
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。
1、如果查询的两个表大小相当,那么用in和exists差别不大。
2、如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表A(小表),表B(大表)
第一中情况:
select * from A where cc in (select cc from B)效率低,用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=A.cc)效率高,用到了B表上cc列的索引。
第二中情况:
select * from B where cc in (select cc from A)效率高,用到了B表上cc列的索引;
select * from B where exists(select cc from A where cc=B.cc)效率低,用到了A表上cc列的索引。
exist会针对子查询的表使用索引.
in与子查询一起使用的时候,只能针对主查询使用索引.
not exist会对主子查询都会使用索引.
not in则不会使用任何索引.
综上,无论那个表大,用not exists都比not in要快。
二、>和>=和<和<=操作符
大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找。但有的情况下可以对它进行优化
,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。那么执行
A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到A=3的记录索引。
三、Like操作符
LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%蒋%’ 这种查询不会引用索引,而LIKE ‘蒋%’则会引用范围索引。
四、OR和UNION ALL
应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
五、SELECT* 和SELECT 列名
在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。此外,在select查询中如有不必要的列,会带来额外的系统开销,特别是LOB类型的列。EXISTS 子查询是唯一允许出现SELECT* 的情况
六、WHERE书写优化
1、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描
2、应将可以过滤掉大量数据的条件放前边
这些是公司之中基本需要考虑的SQL优化基础,在公司中师兄师姐的指导下慢慢体会出来的,有什么不对的请路过的大神多多指教。
及 <和 <= 操作符