B树、B-树、B+树的定义和区分

2023-11-16

B- 树

B-树又名B树,我们把所有的数据进行折半块查找,比如一共100条数据。在30和60的地方分一下,存放30和60的节点就是根节点。30和60就是该节点的关键字,100也就是分成了3份,这个节点自动创建三个指针。这三份就是根节点的子节点,(敲黑板划重点,子节点的个数=关键字个数+1,没有子节点就不说了)。下面继续分,拿其中一个子节点举例,把30分成3分,10和20当成关键字,下面继续是三个子节点。。。依次类推。
如下
在这里插入图片描述
在这里插入图片描述
而这种类型就是B-树,它的所有关键字都分布在节点中。不一定就是我写的两个。
特点如下:

  1. 定义任意非叶子结点最多只有M个儿子;且M>2;
  2. 根结点的儿子数为[2, M];
  3. 除根结点以外的非叶子结点的儿子数为[M/2, M];
  4. 每个结点存放至少M/2-1(取上整)和至多M-1个关键字(至少2个关键字);
  5. 非叶子结点的关键字个数=指向儿子的指针个数-1;
  6. 非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
  7. 非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;
  8. 所有叶子结点位于同一层;

ps:k是关键字,p是指针(就是图中的箭头),只要有子节点的 都是非叶子节点。

B-树的搜索依然是从根节点开始,对关键字序列进行二分查找,如果找到则命中。如果没有,就按照相应的范围根据指针去相应的子节点。直到命中。

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

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

有的同学就说了,那数据量大的时候不是依然会查询到最底层的叶子节点。 这就是B-树的缺点,但是相比B树来说已经高级了许多。

B+树

其实B+树与B-树相差并不大,由于B-树可能会最高级的根节点查询到最低级的叶子节点。那我们可以从叶子节点开始查啊,这就产生了B+树结构。

在每一个叶子节点做一个标记,把这些标记存起来,每次查的时候可以在查询根节点的时候从叶子节点也开始查,这样是不是就省了好多时间呢。
而这些标记就是链指针。把这些链指针存进一张表中,这个表就是稠密索引.
在这里插入图片描述
这些链指针在链表中是有序存储的,在搜索中能省大量的时间。
那这些链指针可不可以加在所有的节点中呢,答案是可以的,除了根节点,所有的节点都可以加上链指针。这就是B*树索引

B*树

在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;
在这里插入图片描述

后记:写这篇文章,其实是因为今天在一个大神开的java群中,有人问什么是回表查询,为什么会有回表查询。讨论的时候发现自己对索引一知半解,刚好下午有时间,就查资料写了这篇文章。

关于回表查询
比如select a from T where b=?
如果a没有索引,那在查询的时候先得得到的是b对应这条数据所在的行数。拿着这个行数,再去表中查询这条数据,得到a字段。而拿着这个行数去得到a字段的动作,就是回表查询

我们如何避免回表查询呢,首先就是不要用 ” * “ 查询,因为这时候会默认查询的字段没有索引,必定进行回表查询。

在一张表中单独查询次数多的字段,尽量加上索引吧。但是也不能遇见一个查询字段就加索引,那样的效率会越来越低,得不偿失。毕竟任何事情都是有个度的

引用:https://blog.csdn.net/timer_gao/article/details/78013826
https://blog.csdn.net/idber/article/details/8087521

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

B树、B-树、B+树的定义和区分 的相关文章

  • mysql DATE_FORMAT导致索引失效

    最近在优化一个统计的接口 在几十万的数据统计下 接口处理的响应时间达到了20s 看了下代码逻辑 发现其中主要有三个主要的统计方法 在优化了其中一个方法的统计逻辑后 接口的响应时间下降到了3s内 还是没有达到期望的响应时间 1s内 看了下另外
  • mysql聚簇和非聚簇索引的区别

    都是B 树的数据结构 聚簇索引 将数据存储与索引放到了一块 并且是按照一定的顺序组织的 找到索引也就找到了数 据 数据的物理存放顺序与索引顺序是一致的 即 只要索引是相邻的 那么对应的数据一定也是 相邻地存放在磁盘上的 非聚簇索引 叶子节点
  • Mysql的B+树高度计算

    问题 假设B 树的高度是2 一行数据的记录大小是1K 主键ID是int类型 问 该B 树存放的总记录数 知识点 Mysql的默认存储引擎是Innodb Innodb的最小存储单位是页 一页大小等于16K B 树的叶子节点存放数据 内部节点存
  • Doris---索引

    前缀索引 doris中 对于前缀索引有如下约束 他的索引键最大长度是36个字节 当他遇到了varchar数据类型的时候 即使没有超过36个字节 也会自动截断 示例1 以下表中我们定义了 user id age message作为表的key
  • C# 索引器(Indexer)

    C 索引器 Indexer 转自 http www runoob com csharp csharp indexer html 索引器 Indexer 允许一个对象可以像数组一样被索引 当您为类定义一个索引器时 该类的行为就会像一个 虚拟数
  • 数据结构(十七) -- 树(九) --B树B+树

    数据结构演示网址 数据结构演示地址 1 出现背景 B树B 树目的 为了硬盘快速读取数据 降低IO操作次数 而设计的一种平衡的多路查找树 二叉查找树 AVL树 红黑树等都属于二叉树的范围 查找的时间复杂度是O log 2N 与树的深度相关 那
  • MySql索引原理与使用大全

    林炳文Evankaka原创作品 转载请注明出处http blog csdn net evankaka 一 索引介绍 索引是对数据库表中一列或多列的值进行排序的一种结构 在关系数据库中 索引是一种与表有关的数据库结构 它可以使对应于表的SQL
  • MySQL是怎样运行的:从根儿上理解MySQL

    文章目录 快速查询的秘籍 B 树索引 1 没有索引的查找 1 1 在一个页中的查找 1 2 在很多页中查找 2 索引 2 1 一个简单的索引方案 2 2 InnoDB中的索引方案 1 聚簇索引 2 二级索引 2 3 InnoDB的B 树索引
  • mysql中索引利用情况(explain用法)

    使用explain查看 如下 1 首先创建表test 语句如下 create table test a int b varchar 10 c varchar 10 2 在表中的a b都创建索引 先后顺序是a b create index i
  • MySQL8 EXPLAIN 命令输出的都是什么东西?这篇超详细!

    引子 小扎刚毕业不久 在一家互联网公司工作 由于是新人 做的也都是简单的CRUD 刚来的时候还有点不适应 做了几个月之后 就变成了熟练工了 左复制 右粘贴 然后改改就是自己的代码了 生活真美好 有一天 领导说他做的有个列表页面速度很慢 半天
  • Java 语言 TreeMap

    Java中的TreeMap是一种基于红黑树实现的排序映射表 它可以存储键值对 其中键和值都可以是任意类型的对象 TreeMap提供了快速的插入 删除和查找操作 具有高效的性能 并且可以根据键进行排序 因此在Java编程中非常常见 本文将介绍
  • mysql using filesort

    今天在explain一个MySQL的sql语句的时候 产生了 如下的结果 extra那一栏多了一个Using filesort 而却type也是ALL这说明了查询的结果是全表扫描 可是笔者明明就在 public time字段加了索引 然而笔
  • 二分法,平衡二叉树、B树、B+树

    二分法 平衡二叉树 B树 B 树 二分法 二分法查找 算法要求 比较次数 二分法到二叉树 平衡二叉树 平衡二叉树概念 平衡二叉树的构建规则 平衡二叉树特点 B树 B tree B树的构建规则 B树的查询流程 B 树 B 树构建规则 B 树和
  • mysql建立索引

    1 添加PRIMARY KEY 主键索引 mysql gt ALTER TABLE table name ADD PRIMARY KEY column 2 添加UNIQUE 唯一索引 mysql gt ALTER TABLE table n
  • 二叉树的非递归遍历算法 - 树结构

    遍历是树结构算法中的重要部分 前面发了有关递归遍历的内容 要知道 递归就是函数调用函数本身 运行起来就是函数嵌套函数 层层嵌套 所以函数调用 参数堆栈都是不小的开销 但是程序简单 然而 非递归即不断地对参数入栈 出栈 省去了函数层层展开 层
  • Elasticsearch学习笔记2:ES核心概念 -- 索引、倒排索引、类型、文档

    一 ES和关系型数据库的对比 Elasticsearch Relational DB 索引 index 数据库 database 类型 types 表 tables 文档 documents 行 rows 字段 fields 列 colum
  • MYSQL篇——性能调优专题

    MYSQL是业界最常使用的数据库 本文以5 7为主 从数据结构到性能调优阐述 深入理解mysql 但是本文只是九牛一毛 若对MYSQL感兴趣建议阅读源码 官方文档 文章目录 MYSQL调优篇 深入理解Mysql索引底层数据结构与算法 Exp
  • 分块查找算法思路、示例和实现

    分块查找 索引表 22 44 74 数组 22 12 13 9 8 33 42 44 38 24 48 60 58 74 47 算法步骤 通过索引表线性查找确定在数组的哪一 块 通过数组里所在 块 的线性查找确定是否存在 在哪个位置 算法代
  • 二叉搜索树(BST的理论剖析+代码实现)

    二叉搜索树 BST树 文章目录 二叉搜索树 BST树 1 二叉搜索树的概念 2 二叉搜索树的结构定义 2 1 二叉搜索树结点模板的定义 2 2 二叉搜索树类模板的定义 3 二叉搜索树的效率 4 二叉搜索树的默认成员函数实现 4 1 BST的
  • numpy索引与切片

    一 整数索引 作用 要获取数组的单个元素 指定元素的索引即可 例子 x np array 1 2 3 4 5 6 7 8 print x 2 3 x np array 11 12 13 14 15 16 17 18 19 20 21 22

随机推荐

  • 第十四届蓝桥杯模拟赛(第三期)试题与题解 C++

    目录 一 填空题 一 最小的十六进制 答案 2730 二 Excel的列 答案 BYT 三 相等日期 答案 70910 四 多少种取法 答案 189 五 最大连通分块 答案 148 二 编程题 一 哪一天 二 信号覆盖 三 清理水草 四 最
  • 关于我写了三万字博客后悔了好久这件事之第二个三万字GUI(swing)

    目录 简介 使用Swing的优势 Swing的特征 Swing基本组件的用法 Swing组件层次 AWT组件的Swing实现 简单了解swing JFrame 弹窗 标签 面板 按钮 3 6 列表 3 7 文本框 JTree TreeMod
  • java的静态与非静态 及其代码演示示例

    静态与非静态的概念 运行Java应用程序时 在实际的代码运行之前的一个步骤是加载类 具体点说 在Java SE 8的JVM中 需要先把类加载到Metaspace 如果类中有静态成员 加载类时会在heap中为其分配空间 此空间是属于类的 类中
  • colab 跑 deformable-detr 记录:

    GPUS PER NODE 1 tools run dist launch sh 1 configs r50 deformable detr sh 报错 cannot import name NewEmptyTensorOp from to
  • ChatGPT能够识别并纠正错误吗?

    ChatGPT在一定程度上可以识别和纠正错误 但其能力有限 以下是对ChatGPT识别和纠正错误能力的详细分析 1 基于模型训练的纠错 ChatGPT模型是通过大规模的训练数据进行训练的 这些训练数据通常是从互联网上收集的文本数据 在这个过
  • C++ 时间函数gmtime、gmtime_r、localtime、localtime_r

    测试环境 vmware 7 Redhat5 5 系统时间使用UTC 时区为上海 1 函数功能介绍 使用man gmtime或man localtime都可以的得到这几个函数的介绍 原型如下 struct tm gmtime const ti
  • JS特性

    JS是解释型语言 不需要提前预编译 JS是弱类型语言 在定义变量的时候不需要定义变量的类型 变量是松散类型 即可以用来保存任何类型的数据 JS没有块作用域 if for都是块 但有函数作用域 JS重复定义变量并不会报错 定义的新变量的值会覆
  • AQS原理 自己浅显理解

    http ifeve com java special troops aqs 这篇博客讲的很好 通篇看完收获不少 精简一下自己的收获 1 AQS是一个基于状态 state 的链表管理方式 reentracntlock这个锁是基于AQS实现的
  • shell-循环语句和case分支

    一 if 循环 if 条件 then 执行内容 elif then 执行内容 else 执行内容 fi 或者 if 条件 then 执行内容 else 执行内容 fi 例 chmod x 脚本名 给与执行权限 二 case 分支 case
  • 1-2、如何学习Linux

    1 2 如何学习Linux 版本说明 版本 作者 日期 备注 0 1 loon 2018 12 6 初稿 目录 文章目录 1 2 如何学习Linux 版本说明 目录 一 前言 二 如何学习Linux 三 最后 一 前言 注意 这里不是要教你
  • 一个人走的快,一群人才走的远

    有太多的技术文章来指引我们解决技术痛点问题 但很少有文字来帮助我们解答个人成长 职业发展 持续学习等思维意识层面的问题 07年计算机专业毕业后 抱着无限的迷茫踏上了漫漫职业生涯路 从菜鸟做起 一路走来也是跌跌撞撞 诚惶诚恐 很多时候都在想
  • Exception: Content is not allowed in prolog-搜集

    用webwork验证时老发生错误 提示Content is not allowed in prolog 由于是解析xml文件出错 找到相应的文件一看 发现开头有几行汉字说明忘注释掉了 我把它们注释掉 问题得到解决 由于以前没遇到这种问题 于
  • MRI是如何实现成像体素的空间定位的

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 磁共振的每一个信号都含有全层的信息 因此需要对磁共振信号进行空间定位编码 即频率编码和相位编码 接收线圈采集到的MR信号实际是带有空间编码信息的无线电波 属于模拟信号而非数
  • matlab 与 VC 混编函数参数传递<2>

    下面是这个例子用到的m代码 它定义了一个名为myadd2的函数 Copy to clipboard CODE function y z myadd2 a b dummy function just to demonstrate the id
  • vmware导入别人虚拟机

    https blog csdn net qq 43271194 article details 105855516 utm source app app version 4 21 1
  • LayUi介绍&前言

    目录 1 什么是layui 2 layui easyui与bootstrap的对比 有趣的对比方式 嘿嘿嘿 easyui jquery html4 用来做后台的管理界面 半老徐娘 bootstrap jquery html5 美女 拜金 l
  • 《学会提问:批判性思维指南》

    批判性思维的三个方面 1 有一套相互关联 环环相扣的关键问题的意识 2 恰如其分地提出和回答关键问题的能力 3 积极主动地利用问题的强烈愿望 思维方式 海绵式思维 1 吸收外部世界的信息越多 就越有头绪 2 被动的方式 不知如何取舍 淘金式
  • XPath提取网页数据(附实例)

    文章目录 一 XPath语法 二 用Python实践 Python爬虫的两个思路 三 三个案例 完整代码 一 XPath语法 借助Chrome浏览器的XPath插件来学习XPath语法 网页测试无误再把规则拿下来写代码 视频学习链接 网络爬
  • java 泛型多重限制,java中基于超类和子类的泛型类型的多重限制

    I have a generic list class that implements a particular interface The list items in the interface also implement the sa
  • B树、B-树、B+树的定义和区分

    B 树 B 树又名B树 我们把所有的数据进行折半块查找 比如一共100条数据 在30和60的地方分一下 存放30和60的节点就是根节点 30和60就是该节点的关键字 100也就是分成了3份 这个节点自动创建三个指针 这三份就是根节点的子节点