【问题标题】:How multiple column b-tree index is organized多列 b-tree 索引是如何组织的
【发布时间】:2011-04-12 12:51:33
【问题描述】:

我想了解更好的索引组织。 假设我们有一个有 2 列的表格:

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

我们想创建一个索引:

CREATE INDEX IDX_MultiColIdx on user(name,age)

B-Tree 索引组织会是什么样子?

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

【问题讨论】:

    标签: database indexing b-tree


    【解决方案1】:

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

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

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

    通常,CHAR 存储在右填充空格,直到其大小,而VARCHAR 则以它的长度为前缀。

    MyISAM和其他一些引擎可以使用key压缩:一组key的匹配部分只存储一次,其他key只存储不同的部分,像这样:

    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 字符”

    【讨论】:

    • 在插入或搜索键时必须忽略长度,因为像... where colm > 'xyz' 这样的不等式会变得非常低效。
    • @paxdiablo:“忽略长度”是什么意思?
    • 这与您的“而 VARCHAR 以它的长度为前缀”评论有关。我的意思是,如果您使用“”作为比较键,它将主要按“名称长度”顺序而不是“名称”顺序。换句话说,它将排序a,b,c,aa,ff,bbbbb 而不是a,aa,b,bbbbb,c,ff。将长度存储在哪里并不重要(只要您可以在键中找到它),只是不要使用长度进行排序/比较。
    • @paxdiablo:实际上,比较函数可能比memcmp 复杂一点。如果你不存储它的长度,你怎么知道列在哪里结束?
    • 如果您要从头到尾遍历树,则无需比较函数即可完成。我说的是找到一个特定的键,它需要比较函数来决定是向左还是向右移动。一棵树只能有一个顺序,在这种情况下应该是名称/年龄对。我的意思是,如果您的比较函数使用姓名长度/姓名/年龄,则排序顺序将是错误。您仍然可以使用等式找到特定的键(因为您知道名称长度和名称),但不等式并不容易,因为顺序是错误的。
    【解决方案2】:

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

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

    例如,给定一个具有顺序键 和 的索引,所有内部节点需要表示的是这些键之间的分隔,可以用单个字符表示。类似地,当内部节点中要分离的键有一个公共前缀时,该前缀只需要存储一次,并表示它们的分歧点。

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

    有关这方面的良好参考,请参阅 Gray & Reuter 的“事务处理:概念和技术”,如果您想了解更多详细信息,请遵循参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 2021-10-29
      • 2020-12-14
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      相关资源
      最近更新 更多