概述

相信对于B树、B-树、B+树、B*树索引这几个大家都很容易混淆,下面单独对这几个索引做下分类总结。


B树

即二叉搜索树:

1.所有非叶子结点至多拥有两个儿子(Left和Right);

2.所有结点存储一个关键字;

3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;

B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;如果B树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变B树结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销;

但B树在经过多次插入与删除后,有可能导致不同的结构:

右边也是一个B树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的树结构索引;所以,使用B树还要考虑尽可能让B树保持左图的结构,和避免右图的结构,也就是所谓的“平衡”问题; 实际使用的B树都是在原B树的基础上加上平衡算法,即“平衡二叉树”。

性能:搜索节点在时间效率上是与二分查找是等价的(根节点左右孩子总数目差不多的情况下)


B-树

是一种多路搜索树(并不是二叉的),B-树索引是基于二叉树结构的。B-树索引结构有3个基本组成部分:根节点、分支节点和叶子节点。其中根节点位于索引结构的最顶端,而叶子节点位于索引结构的最底端,中间为分子节点。

叶子节点(Leaf node):包含条目直接指向表里的数据行。

分支节点(Branch node):包含的条目指向索引里其他的分支节点或者是叶子节点。

根节点(Branch node):一个B树索引只有一个根节点,它实际就是位于树的最顶端的分支节点。

B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点;

B-树的特性:

1.关键字集合分布在整颗树中;

2.任何一个关键字出现且只出现在一个结点中;

3.搜索有可能在非叶子结点结束;

4.其搜索性能等价于在关键字全集内做一次二分查找;

5.自动层次控制;

由于限制了除根结点以外的非叶子结点,至少含有M/2个儿子,确保了结点的至少利用率,其最底搜索性能为

其中,M为设定的非叶子结点最多子树个数,N为关键字总数;

所以B-树的性能总是等价于二分查找(与M值无关),也就没有B树平衡的问题;

由于M/2的限制,在插入结点时,如果结点已满,需要将结点分裂为两个各占M/2的结点;删除结点时,需将两个不足M/2的兄弟结点合并;

性能:性能等价于二分查找,不同于B树的根节点是否平衡的情况


B+树(适合做文件索引系统)

B+树是B-树的变体,也是一种多路搜索树:

1.其定义基本与B-树同,除了:

2.非叶子结点的子树指针与关键字个数相同;

3.非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树

4.B-树是开区间;

5.为所有叶子结点增加一个链指针;

6.所有关键字都在叶子结点出现;如:(M=3)

B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;

B+的特性:

1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;

2.不可能在非叶子结点命中;

3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;

4.更适合文件索引系统;


B*树

是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针;

B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2);

B+树的分裂:当一个结点满时,分配一个新的结点,并将原结点中1/2的数据复制到新结点,最后在父结点中增加新结点的指针;B+树的分裂只影响原结点和父结点,而不会影响兄弟结点,所以它不需要指向兄弟的指针;

B*树的分裂:当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);

如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针;

所以,B*树分配新结点的概率比B+树要低,空间使用率更高;


B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;

B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;

B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;

B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;

后面会分享更多关于DBA方面内容,感兴趣的朋友可以关注下!

b树与b+树的区别_一篇文章理清B树、B-树、B+树、B*树索引之间的区别与联系相关推荐

  1. 解决方案和项目的区别_沃尔玛用大数据提高销售额,云计算和大数据技术之间的区别汇总...

    自从<纽约时报>发表有关沃尔玛如何利用大数据分析来最大化其销售额的文章以来,人们就对大数据充满了狂热.零售商发现飓风期间流行的糖果品牌Pop-Tarts的销量激增,并利用此知识增加了利润. ...

  2. lcl手术和飞秒区别_一篇文章告诉你,ICL与全飞秒近视手术的区别在哪?

    原标题:一篇文章告诉你,ICL与全飞秒近视手术的区别在哪? >>近视眼的痛,你体会过么? 戴眼镜给外表减分.隐形眼镜护理麻烦 升学.参军.找工作受限 还要时刻警惕 随时存在的视网膜脱离.青 ...

  3. git 拉代码_一篇文章理清Git

    Git的作者和简介 Git的作者也是著名的Linux的创始人Linus Torvalds(李纳斯 托沃兹) Git是一个开源的分布式版本控制系统.它其实就是一个工具,一般我们在使用的时候安装在wind ...

  4. mysql索引之间的区别

    2019独角兽企业重金招聘Python工程师标准>>> mysql索引类型: ①主键索引:与唯一索引之间的区别就在于不允许有空值,创建主键时会自动创建此索引. ②普通索引:最基本的索 ...

  5. mysql主键索引和普通索引之间的区别

    索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.MySQL提供多种索引类型供选择:普通索引 .唯一性索引.主键索引 .全文索引等等.下面本篇文章就来给大家介绍一下主键索 ...

  6. nand flash和nor flash区别_从闪存的发展历史看,eMMC与NAND Flash有什么区别与联系?...

    如今,eMMC已发展成为当红的便携移动产品解决方案之一,之前宏旺半导体有说过eMMC的工作原理,今天跟大家聊聊eMMC与NAND Flash有什么区别和联系. 首先我们要认识Flash,Flash分为 ...

  7. python web和java web区别_成都汇智动力-谈谈个人认为的JavaWeb开发与PythonWeb开发的区别...

    原标题:成都汇智动力-谈谈个人认为的JavaWeb开发与PythonWeb开发的区别 今天这篇文章谈一谈Java Web开发和Python Web开发的区别.在这里我并不是鼓励大家从Java Web转 ...

  8. 了解mysql文章_一篇文章带你深入了解MySQL 索引相关

    基础知识 一张数据表中具有百万级的数据时,如何精确且快速的拿出其中某一条或多条记录成为了人们思考的问题. InnoDB 存储引擎的出现让这个问题得到了很好的解决, InnoDB 存储引擎是以索引来进行 ...

  9. 括号表示法字符串构造二叉树_一篇文章学会二叉树和二叉查找树

    树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分层的方式存储数据. 树被用来存储具有层级关系的数据,比如文件系统中的文件. 树还可以用来存储有序列表. 树的定义 树是由一组以边连 ...

最新文章

  1. 周末话题-元编程(metaprogramming)
  2. ZOJ 3728 Collision
  3. c JAVA 注解,Java元注解作用及使用
  4. maven常用命令(编译、测试、运行、打包、安装、部署)
  5. java架构之路(多线程)synchronized详解以及锁的膨胀升级过程
  6. UOJ #117. 欧拉回路
  7. 从 SGD 到 Adam —— 深度学习优化算法概览(一) 重点
  8. Effective C++读书笔记05
  9. Axure软件的使用
  10. svchost.exe小记
  11. python给乘风破浪的姐姐制作词云打call图
  12. 微服务基础知识点学习笔记(持续更新)
  13. 一个亿万富翁的创业自述
  14. 【数量称谓】祖宗十八代
  15. clickhouse--求累计数值
  16. 计算机热点方向、历史、未来
  17. Win Server2003常见问题及解决然方案(转)
  18. 大数据智能分析解决方案
  19. 解决FTP文件访问需要输入用户名和密码的问题
  20. Windows下使用HDFView了解ICESat-2的hdf5文件

热门文章

  1. php base64解码,PHP Base64 中英文编码 JavaScript 解码
  2. Python使用matplotlib可视化相关性分析热力图图heatmap、使用seaborn中的heatmap函数可视化相关性热力图(Correllogram)
  3. R语言dplyr包使用bind_rows函数纵向合并两个dataframe(行生长)、使用bind_cols函数横向合并两个dataframe(列生长)
  4. R语言散点图可视化:自定义标题和标签、拟合回归线、lowess为散点图添加平滑拟合线、修改散点图中点颜色和点符号、分组散点图、添加图例、pairs可视化散点图矩阵、ggplt2可视化、lattice
  5. python秩和检验(Kruskal-Wallis H Test)
  6. R语言关系操作符:>、<=、!=、>=、==、
  7. python代码实现二叉树中最低的公共祖先
  8. 小米android10怎么样,感觉小米10太贵不完美?这些Android旗舰也许就有你的菜!
  9. netstat 命令(Linux)
  10. 三代测序之微生物基因组 de novo 测序