内容参考自http://yijiangyanyu.iteye.com/blog/1677694这篇文章,加上自己的理解。
复合索引,是指在一张表的多个字段上,复合建立一个索引,属于一个数据库对象。
(我觉得复合索引存在的意义是为了解决一张表需要多个字段去进行where条件的筛选,但是Oracle在扫描一张表的时候只能同时访问一个index,最优必然是主键索引,效率最高,但是有时候主键是sequence或者id之类的物理主键,不可能能作为业务的主键,而且很多时候,业务上的主键是多个字段组合起来保证唯一性,所以复合主键的出现就很有必要了)。
同时,复合Index还有一个很有趣的使用技巧
由于单列的B-tree Index不会储存值为null的数据,(因为B-tree Index是对键值进行order by的,null≠null,null也无法进行order by,因此index segement不储存null)在使用单列的index时,对于这个字段的where使用了is null则会使CBO使用全表扫描,(索引段里根本没有null,但是为什么会去对一个字段去进行is null的查询,比较不合理)
举个例子:
select * from table t where t.id = 1 and t.name = 'aa' and t.tel is null ;
以上语句,如果table有idx_id 或者idx_name 这两个单列Index,但是由于用tel is null 这个条件,因此我认为这个语句是绝对不会走index的,必然是full table scan
那这个时候既想要条件中出现is null 又想要走index的情况,就必须使用复合索引