3.索引

3.1.什么是索引

索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低i/o 次数,从而提高数据访问性能。

索引是需要占据存储空间的,也可以理解为是一种特殊的数据。形式类似于下图的一棵“树”,而树的节点存储的就是每条记录的物理地址,也就是我们提到的伪列(ROWID)

3.2.普通索引

语法:

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查询所用的时间要短

 

5.3.唯一索引

如果我们需要在某个表某个列创建索引,而这列的值是不会重复的。这是我们可以创建唯一索引。

语法:

create unique index 索引名称 on 表名(列名);

 

需求:在业主表的水表编号一列创建唯一索引

语句:

create unique index index_owners_watermeter on T_OWNERS(watermeter);

 

3.4.复合索引

我们经常要对某几列进行查询,比如,我们经常要根据学历和性别对学员进行搜索,如果我们对这两列建立两个索引,因为要查两棵树,查询性能不一定高。那如何建立索引呢?我们可以建立复合索引,也就是基于两个以上的列建立一个索引 。

语法:

create index 索引名称 on 表名(列名,列名.....);

根据地址编号和门牌号对业主表创建索引,语句如下:

create index owners_index_ah

on T_OWNERS(addressid,housenumber);

3.5.反向键索引

应用场景:当某个字段的值为连续增长的值,如果构建标准索引,会形成歪脖子树。这样会增加查询的层数,性能会下降。建立反向键索引,可以使索引的值变得不规则,从而使索引树能够均匀分布。

语法:

create index 索引名称 on 表名(列名) reverse;

3.6.位图索引

使用场景:位图索引适合创建在低基数列上   

位图索引不直接存储ROWID,而是存储字节位到ROWID的映射

优点:减少响应时间,节省空间占用

语法:

create bitmap index 索引名称 on 表名(列名);

需求:我们在T_owners表的ownertypeid列上建立位图索引,语句:

create bitmap index index_owners_typeid

on T_OWNERS(ownertypeid)

 

所有的模糊查询都会让索引失效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值