如何组织多列b-tree索引

时间:2010-09-15 06:57:24

标签: database indexing b-tree

我想了解更好的索引组织。 想象一下,我们有一个包含2列的表:

CREATE TABLE user( 
  name varchar(100)
 ,age int)

我们想创建一个索引:

CREATE INDEX IDX_MultiColIdx on user(name,age)

B-Tree索引组织将如何?

如果是一列,例如 age ,则组织是明确的:每个非叶节点都包含一组用于搜索的整数键。哪些值包含 IDX_MultiColIdx B-Tree索引的节点?

2 个答案:

答案 0 :(得分:4)

  

哪些值包含 IDX_MultiColIdx B-Tree索引的节点?

nameage和行指针(RID / ROWID或群集键,取决于表组织)的值,按字典顺序排序。

它们的存储方式取决于数据类型和数据库系统。

通常情况下,CHAR使用空格填充右侧,其长度最大,而VARCHAR前缀为其长度。

MyISAM和其他一些引擎可以使用键压缩:一组键的匹配部分只存储一次,其他键只存储不同的部分,如下所示:

Hamblin
Hamblin, California
Hamblin (surname)
Hambling Baronets
Hambly
Hambly Arena    
Hambly Arena Fire
Hambo
Hambo Lama Itigelov
Hambok
Hambone

将存储为:

Hamblin
[7], California
[7] (surname)
[7]g Baronets
Hambly
[6] Arena   
[6] Arena Fire
Hambo
[5] Lama Itigelov
[5]k
[5]ne

,其中[x]表示“从前一个键中获取前导x个字符”

答案 1 :(得分:1)

我假设您在询问内部数据库实现,因为您提到了“非叶子节点”。

b树中的内部节点不需要存储完整的密钥;他们只需要存储分隔符键。前缀和后缀压缩意味着内部节点可以非常密集,因此可以降低b树的高度,从而提高整体性能。

例如,给定具有顺序键<'非常长的字符串'的索引,314159>并且<'不是相同的字符串',9348>,所有内部节点需要表示的是那些键之间的分隔,这些键可以用单个字符表示。以类似的方式,当要在内部节点中分离的键具有公共前缀时,该前缀只需要存储一次,并且它们分开表示的位置。

叶节点需要存储完整的键值,并且可以存储在链接列表中以进行键顺序遍历。可以使用前缀压缩或其他技术压缩叶节点页面,以进一步降低树高。

有关此问题的详细参考,请参阅Gray&amp ;;的“交易处理:概念和技术”。如果您想了解更多细节,请查看Reuter,并按照参考文献进行操作。