1.B* 索引不会为 全null 值建立索引条目
所以 select * from T where x is null 不会使用索引 (如果索引建在x字段上)
不过, 如果满足以下两个条件, 仍会用到索引
a. 索引建在 (x,y) 上
b. y 被定义为Not Null字段
2. 外键上要不要索引?
a.一般来说都要,否则的话
i.如果修改父表的主键值或者删除父表中一行记录,会导致整个子表被锁
ii.父表中的On Delete Cascade被触发时 也会导致全表扫描
iii.按父表中的值查询子表记录时,由会导致对子表的全表扫描
b.相反地,如果同时满足以下所有条件,就不用加索引
i.不会修改父表主键值且不会删除父表记录
ii.不存在从父表到子表的连接
3.为什么我的索引没有被用上?
i. 索引建在 (x,y)复合字段上,但查询谓词只查了x
ii. select count(*) … 本来用索引就够了,但是如果存在null的数据值,优化器就不敢依赖索引来回答这个查询,因为null值没有索引条目
iii. select … where f(x) = value 不会使用建立在x上的索引,不过它会使用建立在f(x)上的索引
iv. select … where string_column = 5 不会使用索引,因为它实质上是,
select … where to_number(string_column) = 5 //这是一个基于函数的查询
v. 需要返回很多行 => 用索引的效率还不如全表扫描的效率