1、索引的类型
(1、 按逻辑分,逻辑分类从应用程序的角度对索引进行分组 ◎ 单列索引和组合列索引。
◎ 唯一性索引和非唯一性索引
◎ 函数索引
◎ 应用程序域索引
------------------------------------------------------------
◎ 单列索引和组合列索引。 单列索引:在索引关键字中仅有一列,例如:雇员表中雇员编号列上的索引
组合索引:由多个属性列组合起来的索引,比如(姓名,性别,城市),B树索引最多可以包括32列。
对于组合索引的字段顺序选择原则:⊕ 最频繁出现的列,放在前面,
⊕ 选择过滤条件最好的字段在前面
--比如: 组合索引(a,b,c),那查询的条件列可以选择索引的组合有如下几种: (a) (a,b) (a,b,c).
where a = x where a = x and b = x where a = x and b = x and c = x 注意:后期版本有跳转索引的功能
在 Oracle9i引入跳跃式扫描的索引访问方法之前,查询只能在有限条件下使用该索引。比如:表emp有一个组合索引键,该索引包含了empno、 ename和deptno。在Oracle9i之前除非在where之句中对第一列(empno)指定一个值,否则就不能使用这个索引键进行一次范围扫描。
从Oracle9i开始,索引跳跃式扫描特性可以允许优化器使用组合索引,即便索引的前导列没有出现在WHERE子句中。索引跳跃式扫描比全索引扫描要快的多。
注意:如果索引是多个列的组合索引,而其中列上包含NULL值,这一行就会处于包含NULL值的索引列中,且将被处理为空(视为NULL)。
技巧:索引列的值都存储在索引中。因此,可以建立一个组合(复合)索引,这些索引可以直接满足查询,而不用访问表。这就不用从表中检索数据,从而减少了I/O 量。 ---IOT?
◎ 唯一性索引和非唯一性索引 ⊕ 唯一索引 保证定义索引的列中没有任何两行有重复值,唯一索引中的索引关键字只能指向表中的一行
通常,主键和唯一性约束,系统自动创建唯一性索引,也可以手工使用USING INDEX命令来创建
主键:create table a (a1 int primary key using index(create index ai on a (a1));
Create table a (x int primary key); ---自动创建索引
Create table b(x int primary key using index(create index ind_b on b(x))); --手动创建索引
唯一索引: ORACLE建议单独指定索引
Create table c(x int,y int,
constraint bu1 unique(x,y) using index (create unique index bi on c(x,y)),
constraint bu2 unique(y,x) using index bi);
主键和唯一索引的唯一区别就是:主键列不能为NULL值
⊕ 非唯一性索引,单个关键字可以有多个与其关联的行
唯一和非唯一的比较: ---可以参考下面的索引结构
B*树索引中有没有 非惟一(nonunique)条目,非唯一性条目 KEY + ROWID,是唯一的,在一个非惟一索引中,Oracle 会把rowid 作为一个额外的列(有一个长度字节)追加到键上,使得键惟一
(1)在一个惟一索引中,根据你定义的惟一性,Oracle 不会再向索引键增加rowid,所以唯一索引占用空间小,因为少了ROWID
(2)唯一性约束的REDO也小很多
(3)在非惟一索引中,数据会首先按索引键值排序(依索引键的顺序),然后按rowid 升序排序。而在惟一索引中,数据只按索引键排序
(4)一般来讲,在索引中找到一个key只需要执行2 或3次I/O。1次IO也可能,比如IOT或簇
◎ 函数索引(function-based index)
◎ 应用程序域索引域索引,应用程序域索引称为扩展型索引
用于处理特殊应用的索引,如TEXT文本的搜索, 利用INTERMEDIA来搜索视频,指纹识别等
它相当于自定义索引规则的索引类型,我们前面基于逻辑对索引进行了分类,那我们接着基于索引的物理存储的不同,来介绍索引的类型。
域索引不是段,它不需要存储空间,它只是一种定义,所以域索引永远是SYS用户下的
------------------------------------------------------------
(2、按物理存储的不同,来介绍索引的类型◎ 分区索引和非分区索引
◎ B*树索引(ORACLE默认类型)
◎ 位图索引
------------------------------------------------------------
◎ 分区索引和非分区索引 ⊕ 非分区索引就是我们的常规表索引
⊕ 分区索引用于大型表的海量数据库VLDB,基于多个分区列上的索引存储到多个分区索引段。
基于表分区单独创建的索引称为本地索引,本地索引分前缀本地分区索引和非前缀本地分区索引。
基于全表的分区键来建立分区索引段的称为全局分区索引,全局分区索引只有前缀全局分区索引
10G主要有范围和HASH两种:
◎ B*树索引(ORACLE默认类型) B树索引最多可以包括32列
B*树索引的构造类似于二叉树,能根据键提供一行或一个行集的快速访问,通常只需很少的读操作就能找到正确的行
B*树索引又下面几种:
⊕ 索引组织表 IOT其实就是种索引,而且是B*树索引,它只不过多了表数据
⊕ B*树聚簇索引 同样,聚簇索引也是B*树
⊕ 降序索引 在9I后,ORACLE提供了降序索引,也就是我们执行ORDER BY XXX DESC会用到降序索引,默认是升序。
它允许在索引中以降序(从大到小的顺序)存储一列,而不是升序(从小到大)存储
⊕ 反向键索引 用于RAC系统,键值顺序存放在的相同或者相邻的块上(几率比较大),容易造成并发热索引块。通过反转函数,将原来物理相邻的键值,分散到不相邻的索引块上,避免范围扫描时过度频繁扫描某些块。
B-tree 特点:
适合与大量的增、删、改(OLTP)
不能用包含OR操作符的查询;
适合高基数的列(唯一值多)
典型的树状结构;
每个结点都是数据块;
大多都是物理上一层、两层或三层不定,逻辑上三层;
叶子块数据是排序的,从左向右递增;
在分支块和根块中放的是索引的范围;
◎ 位图索引
------------------------------------------------
2、索引的结构
索引实体分两部分:
⊙ KEY部分 ◎ KEY部分的长度
◎ KEY的实际数据
如果是非唯一性索引,那么KEY增加下面两项:
◎ ROWID的长度
◎ ROWID
⊙ DATA部分(可选项) ◎ 如果是唯一性索引,那么DATA部分是ROWID
◎ 如果是非唯一性索引,那么DATA部分是NULL