<span>026-B树(一)</span>

 

数据库系统的设计者巧妙利用了磁盘预读原理:

       将一个节点的大小设为等于一个页,这样每个节点需要一次I/O就可以完全载入

这是数据库最为重要且极为巧妙的设计。

为了达到这个目的,在实际实现B-Tree还需要使用如下技巧:

      每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。

      而B+树内把真实的数据全部放在了叶子节点中,非叶子节点中只存放了索引的数据,保证了数据项尽可能的多。保证树的高度。

 

 

定义:

 

描述一颗 B树时需要指定它的阶数,阶数 表示 此树的结点 最多 有 多少个孩子结点(子树),一般用字母 M 表示阶数。

 

M 阶的B树 :以【子树】讨论

 

  • 上限:每个节点最多有 M 个子树
  • 下限:
    根节点至少2个子树,
    非根节点至少有⌈M /2⌉个子树

 

所以也称 M 阶B树 为 ( ⌈M /2⌉ , M ) 树 ,即超级节点(除根节点)的子树数的上下限 。

 

注: 超级节点关键码的个数 = 节点子树数 - 1 。

 

例:

 

M = 4 阶,(2, 4)树。 最多含有 3个关键字 和 4个子树 M = 5 阶,(3, 5)树。 最多含有 4个关键字 和 5个子树 M = 6 阶,(3, 6)树。 最多含有 5个关键字 和 6个子树 

 

  • 1
  • 2
  • 3

 

所以,M阶 可理解为 M树,即内含(M-1)个关键字 和 M 个子树。

 

      

 

 

 

 

 

 

 

通过这个结构我们可以看见,在叶子节点中存储的数据是age,name,address的值(假设这些数据都是按照顺序排列好的,图中是随意写的),那么如果我们只想要这几个值的话,都不需要再进行主键定位查询了,提高了一些效率。

小结:

InnoDB的聚集索引是按照主键搜索,是最高效的,辅助索引需要走两次索引,首先查询辅助索引得到主键,再跟进主键查询获得记录。

问题1:不建议主键字段过长:原因上面第2点也讲过一些,过长会造成数据项空间变大,每个节点数据项数目变少,高度增加。

另外我们发现辅助索引的data域记录的也是主键,因此简介造成辅助索引变大,查询困难。

问题2:非单调字段:如果不是单调字段的话,会造成B+树不断的调整,十分低效,上一篇分析过插入和删除。使用自增字段的话会保持一个相对稳定的顺序。

 

 

 

1、内节点:非根非叶子节点,即非根的分支节点。

2、名称:B-树=B树=平衡多路查找树。

3、定义:m阶B树。

  (0)、根节点孩子数rootChildNum范围:若没有孩子节点则孩子数为0,若有孩子则:2 <= rootChildNum <= m

  (1)、树中每个节点的孩子树个数childNum范围:2 <= childNum <= m

  (2)、内节点孩子个数innerChildNum的范围: ceil(m/2) <= innerChildNum <= m

  (3)、节点数据个数dataNum与节点孩子个数childNum关系:childNum = dataNum + 1。而且数据递增排列。

  (4)、所有叶子节点处于同一层次。

4、一颗B树的高度h与节点数n的不等关系建立:

第一层节点数:最少 1

第二层节点数:最少 2

第三层节点数:最少 2 × ceil(m/2)

第四层节点数:最少 2 × ceil(m/2) × ceil(m/2)

依次类推。。。。。。。。。

第h层节点数:最少 2 × [ ceil(m/2) ]h-2

因此高度为h的B树中节点树的最小值为:

 

全部评论

相关推荐

秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
小红书 后端开发 总包n+8w+期权
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务