Oracle 数据库索引原理与实战指南
一、为什么需要索引
索引是存储引擎用于快速定位数据记录的数据结构,就像书籍的目录。查询时,数据库先检查条件是否命中索引:命中则通过索引查找,未命中则需全表扫描。
在没有索引的情况下,数据分布在硬盘不同位置,读取时需要磁头频繁寻道,耗时极长。即使数据顺序存放,逐行比对也需要多次 IO 操作。对于千万级数据表,CPU 必须反复从磁盘加载数据到内存处理,最耗时的就是磁盘 I/O(涉及旋转时间和寻道时间)。
[图示:无索引 vs 有索引的查找路径对比]
引入二叉搜索树等结构后,我们在硬盘上为特定字段维护了索引结构。例如对 Col2 建立索引,查找 Col2=89 时,只需遍历树结构(如读 34->89),仅需两次 IO 即可定位地址。核心目的始终是减少磁盘 I/O 次数,提升查询速率。
二、索引的优缺点
优点
- 提高检索效率:类似图书馆书目索引,降低数据库 IO 成本。
- 保证唯一性:通过唯一索引确保表中每一行数据的唯一性。
- 加速连接:在实现参考完整性时,加速表和表之间的连接查询。
- 优化排序分组:显著减少 GROUP BY 和 ORDER BY 的时间消耗,降低 CPU 占用。
缺点
- 维护成本高:创建和维护索引耗费时间,随数据量增加而上升。
- 占用空间:索引文件存储在磁盘上,大量索引可能比数据文件更快达到尺寸限制。
- 降低更新速度:增删改数据时需动态维护索引,影响写入性能。
建议:若批量插入数据,可考虑先删除索引,插入完成后再重建,以平衡效率。
三、常见索引类型及适用场景
| 索引类型 | 特点 | 适用场景 | 备注 |
|---|---|---|---|
| B-Tree 索引 | 平衡树结构,适合等值/范围查询,高基数列 | 主键、单列/多列查询 | Oracle 默认类型 |
| 唯一索引 | 确保列值唯一,允许一个 NULL | 邮箱、身份证号等唯一约束 | B 树 + UNIQUE 约束 |
| 组合索引 | 多列 B 树,遵循最左前缀原则 | 多条件联合查询 | 注意列顺序 |
| 位图索引 | 位数组存储,专为低基数列设计 | 性别、状态等,数据仓库场景 | 不适合高并发写入 |
| 函数索引 | 基于表达式/函数创建 | UPPER(), LOWER() 等函数查询 | 查询需匹配相同函数 |
| 索引组织表 (IOT) |


