我想了解更好的索引组织。 想象一下,我们有一个包含2列的表:
CREATE TABLE user(
name varchar(100)
,age int)
我们想创建一个索引:
CREATE INDEX IDX_MultiColIdx on user(name,age)
B-Tree索引组织将如何?
如果是一列,例如 age ,则组织是明确的:每个非叶节点都包含一组用于搜索的整数键。哪些值包含 IDX_MultiColIdx B-Tree索引的节点?
答案 0 :(得分:4)
哪些值包含 IDX_MultiColIdx B-Tree索引的节点?
name
,age
和行指针(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,并按照参考文献进行操作。