B+树

一、B+树

1.1 多级索引

1.1.1 概念

  • 当索引项比较多时,可以对索引再建立索引,以此类推,形成多级索引

1.2 B+树的基本概念

  • B+树索引:一种以树型数据结构来组织索引项的多级索引

  • 一块中索引项的组织
    • K_i索引字段值
    • P_j指针,指向索引快或数据块中记录的指针
  • 能够自动保持与主文件大小相适应的树的层次
  • 每个索引块的指针利用率都在50%-100%之间

1.3 B+树的存储约定

1.3.1 一块中存放的索引项的数量

  • 有n-1个索引项(<索引字段值K_i,指针P_j>)+1个指针(P_n)
  • 索引字段值x在K_{i-1}\leq x < K_iP_i指向;而K_i\leq x< K_{i+1}的由P_{i+1}指向

1.3.2 叶节点和非叶节点的指针指向

  • 非叶节点指针指向索引块,叶节点指针指向主文件的数据块或数据记录

  • 叶节点的最后一个指针可能不同于它的其他指针--始终指向其下一个数据块

  • 一个索引块实际使用的索引指针个数d,满足(根节点除外):\frac{n}{2}\leq d\leq n
  • 根节点至少2个指针被使用
  • 索引字段值重复出现于叶节点和非叶节点

  • 指向主文件的指针仅出现于叶节点
  • 所有叶节点即可覆盖所有健值得索引
  • 索引字段值在叶节点中是按顺序排列的
  • 级数(或层数)相同--平衡
  • 插入/删除记录时,伴随着节点的分裂与合并
  • 分裂与合并将调整部分节点块中的索引项

1.4 用B+树建立不同的索引

1.4.1 用B+树建立键属性稠密索引

  • 索引字段是主文件的主键,索引是稠密的。主文件可以按主键排序,也可以不按主键排序。指针指向的是记录

1.4.2 用B+树建立稀疏索引(或主索引)

  • 索引字段是主文件的主键,索引是稀疏的。主文件必须按主键排序
  • 指针指向的是数据块

1.4.3 用B+树建立非键属性稠密索引

  • 索引字段是主文件的非键属性,索引是稠密的。主文件按非键属性排序
  • 索引文件的索引字段是无重复的。指针指向的是记录

1.4.4 用B+树建立非键属性稠密索引

  • 索引字段是主文件的非键属性。主文件不按此非键属性排序
  • 索引文件的索引字段值是有重复的。指针指向的是记录。

  • 索引字段带有重复值的B+树的非叶节点示例

1.5 B+树 VS B树

1.5.1 B树

  • 索引字段值仅出现一次或者在叶结点或者在非叶结点
  • 指向主文件的指针出现于叶结点或非叶结点
  • 所有结点才能覆盖所有键值的索引

二、B+树之键值插入与结点分裂过程示意

2.1 插入

  • 在下列B+树中插入键值为40的记录

  • 过程

  • 关键:
    • 分裂
    • 由叶结点向根结点逐层处理
    • 指针调整

2.2 删除

  • 在下列B+树中删除键值为7的记录

  • 过程

  • 问题2:删除键值为11的记录

  • 关键
    • 合并
    • 由叶结点向根结点逐层处理
    • 指针调整

三、散列索引

3.1 散列的基本概念

  • 有M个桶,每个桶是有相同容量的存储地
  • 散列函数h(k),可以将键值k映射到\left \{ 0,1,...,M-1 \right \}中的某一个值
  • 将具有键值k的记录Record(k)存储在对应h(k)编号的桶中

  • 目标:选择一个合适的散列函数,将一个Record集合(每个Record都包含一个关键字k)均匀地映射到M个桶中。即:对于集合中任一个关键字,经散列函数映射到地址集合中任何一个地址的概率是近乎相等的。

3.2 散列索引

  • 内存数据可采用散列确定存储页,主文件可采用散列确定存储块,索引亦可采用散列确定索引项的存储块
  • M个桶。一个桶可以是一个存储块,亦可是若干个连续的存储块

3.3 散列的问题

  • 散列索引的目标
    • 最好是没有溢出桶,每一个散列值仅有一个桶。读写每一个键值都只读写一个存储块
    • 期望将所有数据分布均匀地存储于M个桶中,使每一个桶的额数据成为具有某种特征值h(k)的数据集合。---散列函数的选择
  • 桶的数目M的确定
    • 在键值几倍于桶的数目时,每个散列值都可能多于一个桶,形成一个主桶和多个溢出桶的列表,此时需要二次检索:先找到主桶号,再依据链表逐一找到每个溢出桶。
    • 桶的数目M是固定值---静态散列索引
      • 如果桶的数目M不变:M过大,则浪费;M过小,则将产生更多的溢出桶,增加散列索引的时间
    • 桶的数目随键值增多,动态增加---动态散列索引
      • h(k)是和桶的数目M相关的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值