先不论索引是否被滥用,今天只谈虽然建立了索引,但不同的SQL语句写法,用不上的问题
看看下面这颗树,就知道索引用不了的原因了
a
ab ad
abc adm
abcd admn
1. not 用不了索引
2. <> 用不了索引
3. 与null值比较用不了索引
4. like , select * from emp where ename like 'luo%' --能用上
select * from emp where ename like '%dai' --不能
5. 查询字段使用了函数
select * from emp where to_char(reg_date,'yyyy')='2009'
当然,还包括了||连接符,对查询字段做运算等,如: where age+1=30
[b] 解决办法,使用FBI(基于函数的索引)[/b]
6. 多个字段建立组合索引
如对班号,姓名建立索引,并且班号在前
where class_no='200105302' and stu_name= '罗某' --可以用索引
where class_no='200105302' --可以
where stu_name='罗某' --不可以
原因和like类似
7. 注意数据类型隐式转换的问题
如service_type字段,数据库表里varchar2类型,但是像下面这样写
where service_type=82 --用不了,隐式类型转换
看看下面这颗树,就知道索引用不了的原因了
a
ab ad
abc adm
abcd admn
1. not 用不了索引
2. <> 用不了索引
3. 与null值比较用不了索引
4. like , select * from emp where ename like 'luo%' --能用上
select * from emp where ename like '%dai' --不能
5. 查询字段使用了函数
select * from emp where to_char(reg_date,'yyyy')='2009'
当然,还包括了||连接符,对查询字段做运算等,如: where age+1=30
[b] 解决办法,使用FBI(基于函数的索引)[/b]
6. 多个字段建立组合索引
如对班号,姓名建立索引,并且班号在前
where class_no='200105302' and stu_name= '罗某' --可以用索引
where class_no='200105302' --可以
where stu_name='罗某' --不可以
原因和like类似
7. 注意数据类型隐式转换的问题
如service_type字段,数据库表里varchar2类型,但是像下面这样写
where service_type=82 --用不了,隐式类型转换