Oracle索引

       前言

        Oracle索引使用可以加快数据库搜索速度、提高数据库的性能。索引与表关联的可选结构。


Oracle索引的分类
  • B树索引(标准索引)
  • 分区或非分区索引
  • 正常或反向键索引
  • 位图索引
  • 单列或组合索引
  • 唯一或非唯一索引
  • 基于函数索引

Oracle索引原则
  1. 频繁搜索的列可以作为索引
  2. 经常排序、分组的列可以作为索引
  3. 经常用作连接的列(主键\外键)可作为索引
  4. 将索引放在一个单独的表空间中,不要放在有回退段、临时段和表的表空间中
  5. 对大型索引而言,考虑使用NOLOGGING子句创建大型索引
  6. 根据业务数据发生的频率、定期重新生成或重新组织索引、并进行碎片整理
  7. 仅包含几个不同值的列不可以创建为B数索引,可以根据需要创建位图索引(对于基数大的列适合建立B树索引,对于基数小的列适合简历位图索引)
  8. 不要仅包含几行的表中创建索引
  9. LONG(可变长字符串数据,最长2G)和LONG RAW(可变长二进制数据,最长2G)列不能创建索引
  10. 限制表中索引的数量(创建索引耗费时间,随数据量的增大而增大;索引会占用物理空间;当对表中的数据进行增、删、改的时候,索引也要动态的维护,降低数据的维护速度)
  11. 列中有很多空值,但经常查询该列上非空记录时应该建立索引

Oracle索引注意情况

1.通配符在搜索词首出现时,oracle不能使用索引、如:

--我们在name上创建索引;
create index index_name on student('name');
--下面的方式oracle不适用name索引
select * from student where name like '%wish%';
--如果通配符出现在字符串的其他位置时,优化器能够利用索引;如下:
select * from student where name like 'wish%';
  1. 不要在索引列上使用not,可以采用其他方式代替如下:(oracle碰到not会停止使用索引,而采用全表扫描)
  2. 索引上使用空值比较将停止使用索引
  3. 建立组合索引,但查询谓词并未使用组合索引的第一列,此处有一个INDEX SKIP SCAN概念。
  4. 在索引列上使用函数时不会使用索引,如果一定要使用索引只能建立函数索引。
  5. 当被索引的列进行隐式的类型转换时不会使用索引。

Oracle索引
  • 唯一索引:定义索引的字段列不能有重复值。

    --添加唯一索引
    create unique index index_name on 表名(字段名);    
  • 反向键索引:常规B树索引相反,在保持列顺序的同时反转索引列的字节。对于连续增长的索引列,可以将索引数据分散在多个索引块间减少I/O瓶颈发生。

    --添加反向键索引
      create index index_reverse_name on 表名(字段名) reverse;
  • 位图索引:适用于低基数列(低基数:内容多单类型少很多重复的值)。

    --添加位图索引
    create bitmap index index_name on 表名(字段名);
  • B树索引:也称为标准索引。顶部为根、下一级为分支块。按关键字值的升序和降序扫描所有。

    --添加B树索引
    create index index_name on 表名(字段名);
  • 创建索引:索引名必须是唯一的

    create [unique]|[bitmap] index index_name on 表名(字段名);
    [tablespace tablespacename]
  • 删除索引

    drop index index_name;
  • 重建索引

    --将反向键索引改为正常B树索引
    alter index index_name rebuild noreverse;