索引简记

以下描述默认的 RDBMS 是 Oracle.

索引是加速数据存取的数据对象。合理使用索引可以大大降低 IO 读写次数,提高 DB 性能。但索引不是越多越好,索引也需要维护成本。索引的层次不能太多,一般不要超过4层。索引记录在 dba_indexes, user_indexes 里。当创建主键时,如果还没创建过聚集索引,则系统会自动在主键上创建唯一、聚集索引,创建在主键上的索引不能直接用删除,必须先删除主键上的约束。

使用场景

适合建索引的场景:

  • 表数据很多
  • 字段经常被查询,如在 where 子句或连接条件经常引用的列上建立索引
  • 更新比较少的字段

不适合建索引的场景:

  • 表数据太少
  • 很少引用的字段,如不经常查询的字段
  • 逻辑型字段
  • 经常更新的字段

分类

按数据存储方式:B*, 反向,位图

按索引列的个数:单列索引,复合索引

单列索引:

create index nameIndex on customer(name);

复合索引:

create index nameIndex on customer(name, job)

create index nameIndex on customer(job, name)

以上是两个不用的索引。

按索引列值的唯一性:唯一索引,非唯一索引

其他分类方式:函数索引,全局索引,分区索引

按情况的不同,会在不同的列上建立索引,甚至是不同种类的索引。B*树索引建立在重复值很少的列上,位图索引建立在重复列较多但不同位图相对固定的列上。

缺点

索引要占用的一定的存储空间,建立索引的表的大小一般是原先的1.2倍。表更新后,索引也需要更新,需要好用额外的维护成本(时间和空间的)。