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