WHERE条件的优化:
1、IN:至少多一个转换的过程(先试图转成多个表的连 接,如果转换不成功先执行IN里面的子查询,再查询外层记录)
2、NOTIN:不能应用表索引,可用NOT EXISTS替换的
3、<>: 不用索引,全表扫描。替换方案:>X OR <Y
4、>与>=的区别 >2会从2开始找数据,>=3则是从3开始找数据。但是>=3不知道是否会影响索引功能,采用哪个需根据实际数据(自己估测)选择。
5、 LIKE:'%%'将不使用索引,'%'引用范围索引
6、UNION:二表链接后进行排序,删除重复,再返回结果。UNION ALL 直接合并返回结果。
7、SQL书写影响,尽量做到带上所有者(性能),保持一种风格(同一查询,书写不一时可能会共享不了前一次查询产生的缓存)
8、 WHERE 后面条件顺序:把过滤数据越多的放到越前面。
9、FROM后表顺序:数量越小的放前面。
10、索引的利用:
A、采用函数处理的字段不能利用索引,如:
substr(COL1,1,4)=’ABCD’,优化处理:COL1 like ‘ABCD%’
B、进行了显式或者隐式转换的不能利用索引,如:
COL1+20>50,优化处理:COL1>30
'X'+COL1>'X5400021452', 优化处理:COL1>'5400021542'
C、条件内包含多个字段的不能利用索引,如:
COL1>COL2,无法 进行优化
COL1+COL2=’ABCD’,优化处理:COL1=’AB’ and COL2=’CD
关于索引
1、有大量重复值、且经常有范围查询(between, >,< ,>=,< =)和order by、group by发生的列,可考虑建立群集索引;
2、经常同时存取多列,且每列都含有重复值可考虑建立组合索引;
3、组合索引要尽量使关键查询形 成索引覆盖,其前导列一定是使用最频繁的列。