当前位置:首页 > 问答 > 正文

Oracle数据库里那些常用索引到底都有哪些类型和特点呢?

Oracle数据库里的索引就像一本书的目录,能帮我们快速找到想要的数据,而不用一页一页地翻,不同的索引类型就像是不同编排方式的目录,适用于不同的场景,下面就来详细说说那些最常用的索引类型和它们各自的特点。

Oracle数据库里那些常用索引到底都有哪些类型和特点呢?

B树索引(B-Tree Index) 这是Oracle数据库中最常见、最默认的索引类型,绝大多数情况下说的索引就是指它,它的结构像一棵倒过来的树,有根节点、分支节点和叶子节点,非常均衡。(来源:Oracle官方文档《Oracle Database Concepts》中对B树索引的阐述)

Oracle数据库里那些常用索引到底都有哪些类型和特点呢?

  • 特点
    • 适用性广:非常适合处理包含大量唯一值的数据列,比如身份证号、手机号等,对于等值查询(比如where id = 123)和范围查询(比如where salary between 5000 and 10000)都非常高效。
    • 自动排序:索引中的条目是按照键值升序或降序存储的,这使得范围扫描非常快。
    • 适合高基数列:基数指的是列中不同值的数量,基数越高(即重复值越少),B树索引的效果通常越好。
    • 维护成本:当对表进行增、删、改操作时,Oracle需要同时维护索引,这会带来一定的性能开销,如果表经常被大批量更新,索引过多可能会影响速度。
    • 不适用于低基数列:对于像“性别”这样只有‘男’、‘女’两种值的列,建立B树索引意义不大,因为通过索引定位后仍然要返回大部分数据行,效率提升不明显。

位图索引(Bitmap Index) 这种索引用一种完全不同的方式来记录数据,它为索引列的每个键值创建一个位图(一串0和1),每一位对应表里的一行,如果该行具有这个键值,位就标记为1,否则为0。(来源:Oracle官方文档《Oracle Database Data Warehousing Guide》中关于位图索引的说明)

Oracle数据库里那些常用索引到底都有哪些类型和特点呢?

  • 特点
    • 专为数据仓库设计:特别适合在数据仓库环境中使用,那里的表通常非常庞大,但数据不经常更新,并且查询多涉及复杂的条件组合。
    • 适合低基数列:正是B树索引的弱项,却是位图索引的强项,对于状态、类型、性别等只有少数几个可能值的列,位图索引非常紧凑且高效。
    • 高效处理多条件查询:当查询条件包含多个用ANDOR连接的列时(例如where 地区='北京' AND 产品类型='电器'),位图索引可以通过快速的位运算(BITMAP AND, BITMAP OR)来合并结果,速度极快。
    • 并发修改的锁问题:这是位图索引最大的缺点,由于一个位图条目对应多行数据,当更新一条记录时,Oracle会锁住整个位图片段,这会阻塞其他会话对同一片段内其他行的更新操作,它绝对不适合高并发、频繁更新的OLTP系统。

函数索引(Function-Based Index) 普通的索引是针对列的原值建立的,而函数索引是针对列经过函数计算后的结果建立的。(来源:Oracle官方文档《Oracle Database Administrator’s Guide》中关于基于函数的索引的章节)

  • 特点
    • 优化函数表达式查询:当查询条件中包含函数时,比如where UPPER(last_name) = 'SMITH' 或者 where salary * 12 > 100000,如果没有函数索引,即使last_name或salary列上有普通索引,Oracle也无法使用,会导致全表扫描,创建了对应的函数索引(如CREATE INDEX idx_upper_name ON emp(UPPER(last_name)))后,查询就能利用索引了。
    • 提升查询性能:通过将计算提前到索引构建阶段,避免了在查询时对每一行数据都进行函数计算,大大提升了速度。
    • 需要函数确定性:创建函数索引时,使用的函数必须是“确定性”的,即对于相同的输入,总是返回完全相同的结果,像SYSDATECURRENT_TIMESTAMP这样每次调用结果都不同的函数就不能用于创建函数索引。

反向键索引(Reverse Key Index) 这种索引可以看作是B树索引的一个特殊变种,它会将索引列的键值(比如12345)的字节顺序反转(变成54321),然后用这个反转后的值来建立标准的B树索引。(来源:Oracle官方文档《Oracle Database Performance Tuning Guide》中对反向键索引的介绍)

  • 特点
    • 解决“右倾”热点问题:对于像序列号(Sequence)这种一直递增的列,传统的B树索引的所有新数据都会插入到索引树最右边的叶子块上,造成热点块竞争,反向键索引通过反转键值,将连续递增的值打散,分布到索引的不同块中,从而均衡I/O。
    • 主要用于RAC环境:在Oracle RAC(实时应用集群)环境中,多个实例同时插入数据,这种索引能有效减少对索引叶子块的争用。
    • 牺牲范围查询:由于键值被反转了,原本连续的值变得不连续,反向键索引完全无法支持基于原始键值的范围扫描(如where id > 100 and id < 200),它只适用于等值查询。

位图连接索引(Bitmap Join Index) 这是位图索引的一种高级形式,它并不是在单表的一列上建立索引,而是针对多表连接查询的结果预先建立的索引。(来源:Oracle官方文档《Oracle Database Data Warehousing Guide》中对位图连接索引的详细描述)

  • 特点
    • 预存储连接结果:它事先定义了某个表(通常是事实表,如销售表)与另一个表(通常是维度表,如产品表)的连接条件,并为连接后的结果集上的列创建位图索引,可以为销售表创建一个索引,直接指向产品表的“产品类别”列。
    • 消除连接操作:在执行查询时,如果查询条件正好匹配索引定义的连接条件,Oracle可以直接使用这个索引来获取结果,而无需在运行时执行昂贵的表连接操作,极大提升了星型查询(数据仓库中典型的查询模式)的性能。
    • 应用场景特定:这同样是一个为数据仓库环境设计的强大工具,在OLTP系统中基本不会使用,因为其维护成本非常高,且结构复杂。

选择哪种索引并没有一成不变的规则,完全取决于你的数据特点、业务逻辑和查询模式,理解每种索引的工作原理和优缺点,是进行有效数据库性能优化的关键第一步。