一、索引介绍
1. 为什么使用索引
索引是存储引擎用于快速找到数据记录的一种数据结构,好比教科书的目录。通过目录定位页码,就能快速找到文章。Oracle 数据库同样如此:查询时先判断是否命中索引,命中则走索引查找,未命中则需全表扫描,逐行比对直到找到目标。

如图所示,无索引时数据分散在硬盘不同位置,读取需磁头频繁寻道,耗时巨大。即便数据顺序摆放,逐行读取也相当于多次 IO 操作。假设查找 Col2=89 的记录,若无索引,CPU 必须从磁盘加载数据到内存逐一比较。对于千万级大表,这意味着海量磁盘 IO,而最耗时的正是磁盘旋转和磁头寻道时间。
若采用二叉树等结构存储,如上图所示,为字段 Col2 建立索引即维护一个二叉搜索树。每个节点存储 (K, V) 结构,Key 是列值,Value 是该行数据的物理地址(指针)。例如根节点为 (34, 0x07)。查找 Col2=89 时,先遍历树:读 34 到内存,89>34 向右;读 89 到内存,匹配成功。此时仅需两次查找即可定位地址,速度显著提升。
建索引的核心目的,就是减少磁盘 IO 次数,加快查询速率。
2. 索引及其优缺点
索引概述 索引是帮助 Oracle 高效获取数据的数据结构。本质上是'排好序的快速查找数据结构',满足特定查找算法。这些结构以某种方式指向数据,从而实现高级查找。
索引是在存储引擎中实现的,因此不同引擎的索引实现可能不同,支持的类型和最大索引数、长度也有差异。所有存储引擎至少支持每个表 16 个索引,总长度至少 256 字节。
优点
- 类似图书馆书目索引,提高检索效率,降低数据库 IO 成本,这是创建索引的主要原因。
- 通过唯一索引可保证表中每一行数据的唯一性。
- 加速表和表之间的连接,对依赖关系的子表和父表联合查询提升明显。
- 分组和排序时显著减少 CPU 消耗和时间。
缺点
- 创建和维护索引耗费时间,数据量增加后耗时更甚。
- 占用磁盘空间,大量索引可能导致索引文件接近最大尺寸。
- 虽然提升查询速度,但会降低更新表的速度。增删改时索引需动态维护。
选择索引时需综合权衡。若批量插入数据,可考虑先删除索引,插入完成后再重建。
二、常见索引类型
优先使用 B-Tree 索引 + 组合索引,根据查询模式添加函数索引或位图索引。
| 索引类型 | 特点 | 适用场景 | 备注 |
|---|---|---|---|
| B-Tree 索引 (默认) | 平衡树结构,适合等值/范围查询,高基数列 | 主键、单列/多列查询 | Oracle 默认非唯一索引 |
| 唯一索引 | 确保列值唯一,允许一个 NULL | 邮箱、身份证号等唯一性约束 | B 树 + UNIQUE 约束 |
| 组合索引 | 多列 B 树,遵循最左前缀原则 | 多条件联合查询 |


