反向索引有什么意义?

问题描述 投票:0回答:2

我刚刚了解了反向索引。 维基百科页面说

在数据库管理系统中,反向键索引策略反转 在将其输入索引之前的键值。1 例如,值 索引中的 24538 变为 83542。反转关键值是 对于索引数据(例如序列号)特别有用,其中 每个新的键值都大于先前的值,即值 单调增加。反向键索引变得特别 在大容量交易处理系统中很重要,因为它们 减少索引块的争用。

为什么反转键值对于索引序列号有用?另外,为什么反向索引有助于减少大容量系统中索引块的争用?简而言之:反向索引的意义是什么?

database distributed-computing
2个回答
46
投票

在您的示例中,它指的是连续数字是反向索引的良好应用。取引用的数字

24538
,它将被插入到索引中的某个点。序列中的下一个数字将是
24539
,它将插入索引中非常接近第一个数字,因为最高有效数字是相同的。扩展这一点,许多连续的数字都需要在几乎相同的点插入,这在扩展索引块和沿途重新平衡索引方面涉及大量开销。

这些数字中最低有效数字的变化速度比最高有效数字变化得更快。因此,颠倒数字的顺序分别给出

83542
93542
。这两个数字将以更远的距离插入到索引中,并将其扩展到更多数字,索引将以更平衡的方式构建,从而减少索引管理的开销。

反转数字的操作在计算方面是微不足道的,而管理索引可能会涉及许多磁盘访问,因此以减少管理开销的方式在索引中插入项目可以带来显着的性能改进。


0
投票

现有的答案很好。

仅供参考 Oracle 的另一个描述:https://docs.oracle.com/database/121/CNCPT/indexiot.htm#CNCPT88844 :

(注意链接跳转好像有点不好,在那个页面搜索“Reverse Key Indexes”就可以了~

反向键索引

反向键索引是一种物理反转的 B 树索引 每个索引键的字节,同时保持列顺序。为了 例如,如果索引键为 20,并且为此存储的两个字节 十六进制的 key 是标准 B 树索引中的 C1,15,然后是 反向键索引将字节存储为 15,C1。

反转密钥解决了叶子块的争用问题 B 树索引的右侧。这个问题可能特别严重 在 Oracle Real Application Clusters (Oracle RAC) 数据库中,其中 多个实例重复修改同一个块。例如,在 订单表中订单的主键是连续的。一 集群中的实例添加顺序 20,而另一个实例添加 21,其中 每个实例将其密钥写入右侧的同一叶块 索引的一侧。

在反向键索引中,字节顺序的反转分布 插入索引中的所有叶键。例如,诸如 在标准键索引中相邻的 20 和 21 是 现在分开存储在不同的块中。因此,用于插入的 I/O 顺序键分布更均匀。

以及缺点:

因为索引中的数据在排序的时候并不是按照列键排序的 存储后,反向密钥排列消除了运行 某些情况下索引范围扫描查询。例如,如果用户 发出大于 20 的订单 ID 的查询,则数据库无法 从包含此 ID 的块开始并水平进行 穿过树叶块。

© www.soinside.com 2019 - 2024. All rights reserved.