看了TOM的书,感慨颇多呀。以前只是知道索引能带来查询速度的提升,却不知道索引还有那么多道道。自己整理了下,希望以后学习的时候用到。
几个问题:
第一,索引是不是越多越好?为什么?索引是需要占用空间和维护的。所以索引不是越多越好。占用空间是指索引本身在内存中占据空间地址。维护是指随着表的增加,减少,索引也要改变,维护也是需要成本的。
第二,索引的种类。
B*树索引:这些是我所说的“传统“索引。到目前为止,这是Oracle 和大多数其他数据库中最常用
的索引。B*树的构造类似于二叉树,能根据键提供一行或一个行集的快速访问,通常只需很少的读操作就
能找到正确的行。
索引组织表(index organized table):索引组织表以B*树结构存储。堆表的数据行是以一种无组
织的方式存储的(只要有可用的空间,就可以放数据),而IOT 与之不同,IOT 中的数据要按主键的顺序存
储和排序
B*树聚簇索引(B*tree cluster index)这些是传统B*树索引的一个变体(只是稍有变化)
降序索引(descending index):降序索引允许数据在索引结构中按“从大到小“的顺序(降序)排
序,而不是按”从小到大“的顺序(升序)排序。
反向键索引(reverse key index):这也是B*树索引,只不过键中的字节会“反转“。利用反向键
索引,如果索引中填充的是递增的值,索引条目在索引中可以得到更均匀的分布。例如,如果使用一个序
列来生成主键,这个序列将生成诸如987500、987501、987502 等值。这些值是顺序的,所以倘若使用一个
传统的B*树索引,这些值就可能放在同一个右侧块上,这就加剧了对这一块的竞争。利用反向键,Oracle
则会逻辑地对205789、105789、005789 等建立索引。Oracle 将数据放在索引中之前,将先把所存储数据
的字节反转,这样原来可能在索引中相邻放置的值在字节反转之后就会相距很远。通过反转字节,对索引
的插入就会分布到多个块上。
位图索引(bitmap index):在一颗B*树中,通常索引条目和行之间存在一种一对一的关系:一个索
引条目就指向一行。而对于位图索引,一个索引条目则使用一个位图同时指向多行。位图索引适用于高度
重复而且通常只读的数据(高度重复是指相对于表中的总行数,数据只有很少的几个不同值)。考虑在一个
有100 万行的表中,每个列只有3 个可取值:Y、N 和NULL。举例来说,如果你需要频繁地统计多少行有值
Y,这就很适合建立位图索引。
位图联结索引(bitmap join index):这为索引结构(而不是表)中的数据提供了一种逆规范化的方
法。例如,请考虑简单的EMP 和DEPT 表。有人可能会问这样一个问题:“多少人在位于波士顿的部门工作?
“EMP 有一个指向DEPT 的外键,要想统计LOC 值为Boston 的部门中的员工人数,通常必须完成表联结,
将LOC 列联结至EMP 记录来回答这个问题。通过使用位图联结索引,则可以在EMP 表上对LOC 列建立索引。
基于函数的索引(function-based index):这些就是B*树索引或位图索引,它将一个函数计算得到
的结果存储在行的列中,而不是存储列数据本身。可以把基于函数的索引看作一个虚拟列(或派生列)上
的索引,换句话说,这个列并不物理存储在表中。基于函数的索引可以用于加快形如SELECT * FROM T WHERE
FUNCTION(DATABASE_COLUMN) = SAME_VALUE 这样的查询,因为值FUNCTION(DATABASE_COLUMN)已经提前计
算并存储在索引中。