一、索引介绍
- 索引 是用于加速数据存取的 数据对象。
- 合理的使用索 引可以大大降低 I/O 次数,从而提高数据访问性能。
- 索引 是需要占据存储空间的,也可以理解为是一种特殊的数据。
- 形式类似于下图的 一棵树,而 树的节点 存储的就是每条记录的 物理地址,也就是提到的 ROWID(伪列)。
二、索引分类
1. 普通索引
create index 索引名称 on 表名(列名);
- 需求:基于 业主表 的 name 字段 来建立索引
create index index_owners_name on T_OWNERS(name);
create table T_INDEXTEST (
ID NUMBER,
NAME VARCHAR2(30)
);
BEGIN
FOR i in 1..1000000
loop
INSERT INTO T_INDEXTEST VALUES (i, 'AA'||i);
end loop;
commit;
END;
CREATE INDEX INDEX_TESTINDEX on T_INDEXTEST(name);
- 执行下面两句 SQL 语句:
会发现根据 name 查询所用的时间,会比根据 id 查询所用的时间要短
SELECT * from T_INDEXTEST where ID = 765432;
SELECT * from T_INDEXTEST where NAME = 'AA765432';
2. 唯一索引
- 需要在 某个表某个列 创建索引,但这列的值是 不会重复的
create unique index 索引名称 on 表名(列名);
- 需求:在 业主表 的 水表编号 一列,创建 唯一索引
create unique index index_owners_watermeter on T_OWNERS(watermeter);
3. 复合索引
- 经常需要对某几列进行查询。如:要根据 学历 和 性别 对进行搜索。
- 如果对这两列建立两个索引,因为需要查两棵树,查询性能不一定高。
- 建立 复合索引,也就是基于两个以上的列建立一个索引
create index 索引名称 on 表名(列名1, 列名2, ...);
create index owners_index_ah on T_OWNERS(addressid, housenumber);
4. 反向键索引
- 如果构建标准索引,会形成 歪脖子树。
- 这样会增加查询的层数,性能会下降。
- 建立 反向键索引,可以使索引的值变得不规则,从而使索引树能够均匀分布。
create index 索引名称 on 表名(列名) reverse;
5. 位图索引
- 位图索引 不直接存储 ROWID,而是存储字节位到 ROWID 的映射。
create bitmap index 索引名称 on 表名(列名);
- 需求:在 T_owners 表的 ownertypeid 列上建立位图索引
create bitmap index index_owners_typeid on T_OWNERS(ownertypeid);