什么是索引
索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低 i/o 次 数,从而提高数据访问性能。
索引是需要占据存储空间的,也可以理解为是一种特殊的数据。形式类似于 下图的一棵“树”,而树的节点存储的就是每条记录的物理地址,也就是我们提 到的伪列(ROWID)
普通索引
语法:
create index 索引名称 on 表名(列名);
需求:我们经常要根据业主名称搜索业主信息,所以我们基于业主表的 name 字段来建立索引。语句如下:
create index index_owners_name on t_owners(name)
索引性能测试:
创建一个两个字段的表
create table t_indextest(
id number,
name varchar2(30)
);
编写 PL/SQL 插入 100 万条记录(关于 PL/SQL 我们在第四章会学到):
BEGIN
for i in 1..1000000
loop
insert into t_indextest values (i, 'AA' || i);
end loop;
commit;
END;
创建完数据后,根据 name 列创建索引
create index index_testindex on t_indextest(name)
执行下面两句 SQL 执行
select * from t_indextest where id=765432;
SELECT * from T_INDEXTEST where NAME='AA765432';
我们会发现根据 name 查询所用的时间会比根据 id 查询所用的时间要短
唯一索引
如果我们需要在某个表某个列创建索引,而这列的值是不会重复的。这是我们可以创建唯一索引。
语法:
create unique index 索引名称 on 表名(列名);
需求:在业主表的水表编号一列创建唯一索引
语句:
create unique index index_owners_watermeter on t_owners(watermeter)
复合索引
我们经常要对某几列进行查询,比如,我们经常要根据学历和性别对学员进行搜 索,如果我们对这两列建立两个索引,因为要查两棵树,查询性能不一定高。那 如何建立索引呢?我们可以建立复合索引,也就是基于两个以上的列建立一个索 引。
语法:
create index 索引名称 on 表名(列名,列名.....);
根据地址和门牌号对学员表创建索引,语句如下:
create index owners_index_ah on t_owners(addressid, housenumber)
反向键索引
应用场景:当某个字段的值为连续增长的值,如果构建标准索引,会形成歪脖子 树。这样会增加查询的层数,性能会下降。建立反向键索引,可以使索引的值变 得不规则,从而使索引树能够均匀分布。
语法:
create index 索引名称 on 表名(列名) reverse;
位图索引
使用场景:位图索引适合创建在低基数列上
位图索引不直接存储 ROWID,而是存储字节位到 ROWID 的映射 优点:减少响应时间,节省空间占用
语法:
create bitmap index 索引名称 on 表名(列名);
需求:我们在 T_owners 表的 ownertypeid 列上建立位图索引,语句:
create bitmap index index_owners_typeid on t_owners(ownertypeid)