索引
逻辑设计分类
-
单列索引
-
复合索引
-
唯一性索引
-
(非唯一性索引)
-
基于函数的索引
--建立基于函数的索引 SELECT VName FROM Video WHERE UPPER(VEngName)=‘LEON’; CREATE INDEX video_engname_upper_idx ON Video(UPPER(VEngName))
物理实现分类
-
分区索引和非分区索引
-
B + 树索引
- 数据库中最常使用的一类索引结构
- 实现与二叉查找树很相似
- 目标是尽可能减少Oracle查找数据所花费的时间
- 最底层的块称为叶子节点(leaf node),包含各个索引键以及一个rowid(指向索引的行)
- 叶子节点之上的内部块称为分支块(branch block),用于在结构中实现导航
- 所有叶子块都应该在树的同一层上。这一层称为索引的高度(height)换句话说,索引是高度平衡的(height balanced)
- B + 树索引中不存在非惟一性条目。在一个非惟一性索引中, Oracle 会把 rowid 作为一个额外的列追加到键上,使得键惟一
-
位图索引
-
正向索引和反向索引
- 反转键索引是一种特殊的B + 树索引
- 实现反转键索引的目的是为了减少“右侧”索引中对索引叶子块的竞争,缓解忙索引右侧的缓冲区忙等待
- 反转键索引比非反转键索引更大、更空,需要更多的I/O才能获取指定的索引项。因此,在选择进行反转之前,用户需要确定争用问题已经非常严重,以至于采用反转键索引的优点大于其缺点。
- 如果用户选择使用反转键索引,那么只需在通常的索引语句末尾添加一个关键字reverse即可。
-
位图联接索引
- 位图索引是为数据仓库/即席查询环境设计的
- 特别不适用于OLTP系统
- 不适应于系统中的数据会由多个并发会话频繁地更新
- 最适合相异基数(distinct cardinality)低的数据
- 如果有大量即席查询(ad hoc query),特别是查询以一种即席方式引用了多列或者会生成诸如COUNT之类的聚合,在这种环境中,位图索引就特别有用
CREATE BITMAP INDEX job_idx ON Emp(job);
--创建索引
CREATE INDEX index_name ON table_name(column_name)
CREATE UNIQUE INDEX index_name ON table_name(column_name)
--查看用户建立了哪些索引
SELECT * FROM user_indexes WHERE table_name=‘VIDEO’;
--查看用户所建索引的细节信息
SELECT * FROM user_ind_columns WHERE table_name=‘VIDEO’;
--修改索引
ALTER INDEX video_engname_upper_idx RENAME TO vupper_idx;
--删除索引
DROP INDEX index_name;
- 优点: 提高数据检索的效率
- 缺点: 过多的索引会影响DML操作的性能
开销
- 使用索引可以提高检索效率,索引的高选择性使其总是比全表搜索能更有效地获取数据
- 索引的出现会对插入、更新等DML操作带来负面影响
索引的联接、压缩和跳跃
--索引的联接
CREATE INDEX idx_ename_empno
ON emp(ename,empno)
CREATE INDEX idx_empno_ename
ON emp(empno,ename)
--键压缩技术的核心是将复合索引中公共的索引项前缀放置到节点的特殊“前缀”区域,将其余的索引项值作为主叶子节点索引项保存,从而避免相同索引项值的冗余存储。
--索引的跳跃搜索的出现意味着用户不需要再像以前那样担心联接索引中的字段次序,既使用户查询正在选取的字段不是索引的起始列,优化器也可以智能地搜索索引。
--优化器能够考虑分支节点所暗示的内容,对叶子节点的内容进行推演。使用跳跃搜索不需要特殊的匹配和设置。然而,它可以让联接索引更加有效,甚至它们的起始键没有作为查询谓词提供也是如此。
一些特定的约束会隐式地创建索引
-
唯一性约束
-
主键约束
创建约束时需要考虑的索引相关问题
- 如果使用唯一性约束,则在禁用约束时,会在没有任何警告的情况下立即删除索引;而在重新启用约束时,导致以前被删除的索引重新创建
- 在声明主键或唯一性约束时,需要考虑是否有机会将它们与其它列上创建的索引相结合。