在进行数据访问时,如果没有索引,那么数据库必须进行全表扫描来查找所需的数据,通过在一个或者多个列上创建索引,可以提高对数据的访问速度,索引也是减少磁盘I/O的方法。
索引特性
索引是一个schema对象,它在逻辑和物理上独立于所关联的对象的数据,因此,索引能够在不影响表的情况下进行删除或者创建。
对于单行数据,索引是通向它的快速访问路径,它只影响执行速度,给定一个已被索引的数据,索引直接指向包含该值的数据行的位置。
索引创建后,数据库自动的维护和使用它,数据库也会自动的反映数据的变化,比如在所有相关的索引中添加、更新和删除行,而不需要用户进行额外的操作。即使插入了新行,索引数据的检索性能几乎保持不变,但是,由于数据库对索引的更新,表上有过多索引会降低DML的性能。
索引有下面的属性:
- 可用性(Usability)
索引分为usable或者unusable,默认为usable。unusable索引不会被DML操作维护,并且被优化器忽略。unusable索引能够改善批量加载的性能。可以使索引unusable,然后rebuild它,而不是删除一个索引,然后重新创建它。unusable索引和索引分区不会占用空间,当改变一个usable索引为unusable时,数据库将会删除它的索引段。
- 可见性(Visibility)
索引也可分为visible或者invisible,默认是visible。invisible索引会被DML操作维护,默认不会被优化器使用。将一个索引置为invisible是使索引unusable或者删除的一种替代方法。在不影响整个应用程序的情况下,删除索引之前测试索引的删除或者临时的使用索引,采用invisible索引是尤其有用的方法。
主键和唯一键可以自动的创建索引,而外键需要手动创建索引。
索引类型
Oracle数据库提供了如下索引:
- B-tree索引(B-tree indexes)
B-tree索引是标准的索引类型,有以下子类型:
Index-organized tables:索引组织表与堆组织表不同,因为数据本身是做引;
Reverse key indexes:索引键的字节被反转;
Descending indexes:将某一特定列或一些列按降序存储数据;