1.索引列不允许为空。
如果索引列存在空值,索引将失效
2. not , <>(不等于) 运算符
高效:
SELECT * from base_student WHERE student_name <> ;
低效:
SELECT * from base_student WHERE student_name < '云南学生1' OR student_name >'云南学生1';
2. “is null” 和 “is not null” 和 “ || ” 和 ” != “
索引列不允许使用 is null和 is not null ,否则索引失效
3.带通配符(%)的like 语句 。
例如:索引列classname 将失效。
SELECT * from base_student b,base_class c WHERE b.class_id=c.id AND c.classname LIKE '%2015%';
4. 避免在索引上进行计算操作
低效:
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效:
SELECT … FROM DEPT WHERE SAL > 25000/12;
5. 避免在索引列上使用函数
SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123')
6. 用 union 代替 or
通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描.
注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. 在下面的例子中, LOC_ID 和REGION上都建有索引.
A.高效
SELECT * from base_student WHERE student_name='云南学生1'
UNION
SELECT * from base_student WHERE student_name='云南学生1'
B.低效
SELECT * from base_student WHERE student_name='云南学生1' OR student_name='云南学生22'
7.用 in 代替 or
低效:
SELECT…. FROM LOCATION WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30
高效:
SELECT… FROM LOCATION WHERE LOC_IN IN (10,20,30);