索引对象
索引是数据库中的一种可选数据结构,通常与表或表簇相关联。它的核心目的是加快数据检索速度。您可以将其想象成一本书的目录:没有目录,您需要逐页翻阅才能找到特定内容;有了目录,您可以直接定位到所需的页码。
在 Oracle 中,索引是通过减少磁盘 I/O 操作来提升查询性能的。
索引的核心工作原理
- 创建:在表的一个或多个列上创建索引。
- 存储:Oracle 会自动创建并维护一个独立的数据结构(如 B-树),其中存储了索引列的值以及对应的行物理地址(ROWID)。
- 查询:当执行带有
WHERE子句的查询时,Oracle 会首先在索引结构中查找符合条件的值,然后直接使用关联的 ROWID 去访问表中的特定行,从而避免全表扫描。
Oracle 主要索引类型
1. B-树索引(Balanced Tree Index)
这是 Oracle 默认 和最常用的索引类型。适用于高基数列(即列中唯一值多,数据重复度低)。
- 结构:像一棵倒置的树,从根节点开始,到分支节点,最后到叶节点。叶节点包含索引键值和对应的 ROWID,并且彼此双向链接,有利于范围查询。
- 适用场景:
- 等值查询(
=) - 范围查询(
BETWEEN,>,<) - 前导列查询(用于复合索引)
- 等值查询(
- 子类型:
- 反向键索引:将索引列的字节顺序反转。适用于序列值(如主键)的插入,能有效减少索引右侧的“热点”争用。
- 降序索引:允许索引按降序存储,优化
ORDER BY column_name DESC查询。
2. 位图索引(Bitmap Index)
使用位图(一串 0 和 1)来表示表中行的数据值。
- 适用场景:
- 低基数列(即列中唯一值少,数 据重复度高),例如:性别、状态标志、地区等。
- 主要用于数据仓库和大量读操作的 OLAP 系统,不适用于高并发的 OLTP 系统。
- 优点:对于多条件的
AND、OR、NOT查询,效率极高,因为可以通过位运算快速完成。 - 缺点:对于频繁的
INSERT、UPDATE、DELETE操作,锁定粒度大,性能很差。
3. 函数索引(Function-Based Index)
基于列的表达式的索引,而不仅仅是列本身。
- 适用场景:查询条件中经常对列使用函数或表达式。
- 示例:
-- 创建索引
CREATE INDEX idx_emp_upper_name ON employees(UPPER(last_name));
-- 使用索引的查询
SELECT * FROM employees WHERE UPPER(last_name) = 'SMITH';