赞
踩
多级索引
当索引项比较多时,可以对索引再建立索引,依此类推,形成多级索引。
B+树索引:一种以树型数据结构来组织索引项的多级索引
结构:
结构:
每个索引块的指针利用率都在50%-100%之间
叶结点和非叶节点的指针指向
索引字段值重复出现于叶结点和非叶结点
所有非叶节点合起来最多只会出现一次叶子结点的索引值
指向主文件的指针仅出现于叶结点,所有叶结点即可覆盖所有键值的索引;
索引字段值在叶结点中是按顺序排列的;
B+树建立不同的索引
针对不同 DBMS 要考虑聚簇索引是不是建立在主键上,所以就有四种情况(主键决定该属性是否重复,聚簇索引决定主文件是否按该属性组织)
建立键属性稀疏索引(或主索引)(有序 + 无重复)
索引字段是主文件的主键,索引是稀疏的。主文件必须按主键排序。
指针指向的是数据块,即同一个数据块只被该索引文件指向一次
建立非键属性稠密索引(有序 + 有重复)
索引字段是主文件的非键属性,索引是稠密的。主文件按非键属性排序
索引文件的索引字段是无重复的。指针指向所有记录不同值其所在的第一个数据块。
建立键属性稠密索引(无序 + 无重复)
索引字段是主文件的主键,索引是稠密的。主文件可以按主键排序,也可以不按主键排序。
指针会指向每条所在的数据块,即使这个数据块已经被指向过了。
非键属性稠密索引(无序 + 有重复)
索引字段是主文件的非键属性,索引是稠密的。主文件不按非键属性排序
索引文件的索引字段是有重复的,会给每条记录都指向所在的数据块。
B Tree vs. B+ Tree
索引字段值都出现在哪里?指向主文件的指针存在哪里?一块中存放的索引项个数是否相同?
对于同一大小的索引块而言,如果都能放满的话,那么B+ 树的索引项个数多于 B树,因为 B+ 树的非叶索引块不放行指针
分裂与合并的方法是否一致?
B+树键值插入与结点分裂
在下列B+树中插入键值为40的记录
(1)、寻找保存键值记录的叶子结点
(2)、应插入结点已满,则申请新结点
(3)、对于应插入但未插入结点,使其均衡存放于两个叶结点中(分裂),然后讲要插入的节点放到分裂后节点的正确位置
(4)、调整叶子节点水平方向指针,使其指向新叶子结点
(5)、寻找指向新叶子结点的父级非叶结点,让操作的节点变为找到的父节点
(6)、向节点插入另外一个分裂得到叶子节点的首元素
(7)、若应插入结点已满,则申请新结点,使其均衡存放于两个叶结点中(分裂),然后讲要插入的节点放到分裂后节点的正确位置
(8)、调整节点的竖直方向,即子结点指针,使其指向正确
重复 (5) - (8),直至当前非叶节点不用分裂
最终状态
总结:实际上就是若子节点分裂,那么先调整水平方向指针,让后上溢分裂得到的右半边节点的首元素,父节点也按照这个规则,如果分裂了就上溢分裂后的右半边节点的首元素,直到不再分裂为止
键值删除与结点合并过程示意
在下列B+树中删除键值为7的记录(窃取)
(1)、叶子结点中寻找等于键值的记录,删除相应的指针及主文件中对应的记录
(2)、调整其左侧(或右侧)结点及本结点中的键值记录, 使其均衡存放于两个叶结点中
(3)、如有调整,则进一步调整其上层非叶结点,重新确定其键值,以满足大于等于键值的记录都在其右侧
在下列B+树中删除键值为11的记录(合并)
(1)、叶子结点中寻找等于键值的记录,删除相应的指针及主文件中对应的记录
(2)、将本结点的剩余键值, 移动到左侧(或右侧)结点。此空结点将被删除。调整叶结点指针
如有调整,则进一步调整其上层非叶结点,重新确定其键值,以满足大于等于键值的记录都在其右侧
总结:实际上删除就是两种合并方法,一种是把当前节点和相邻节点合并,然后调整合并后节点的父节点的指针,另一种是从相邻节点窃取一个元素,然后调整当前节点或相邻节点中,头部元素改变的父节点指针
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。