B树与B+树的区别,为什么MySQL使用B+树不使用B树

关于B树和B+树、为什么在数据库中使用的是B+树而不是B树的? B树和B+树,以及数据库中索引为什么用B+树而不是B树的? 阅读详情

B树与B+树的区别


1. 基本结构上的区别
  • B树:

    • 每个节点既存储键值(key)也存储数据(data)。
    • 数据和键值分布在所有节点(叶子节点和非叶子节点)中。
    • 每个节点的子节点个数为 [ceil(m/2), m],其中 m 是阶数。
  • B+树:

    • 非叶子节点只存储键值(key),不存储数据(data)。
    • 数据只存储在叶子节点中,并且所有叶子节点通过链表相连。
    • 子节点个数同样为 [ceil(m/2), m]。

2. 查询方式上的区别
  • B树:

    • 数据可能存在于非叶子节点,因此搜索路径可能会停在任意节点。
    • 每次查找的数据结果可能提前结束。
  • B+树:

    • 数据只存在于叶子节点,查找时需要访问到叶子节点。
    • 叶子节点间有链表相连,可以方便范围查询和顺序遍历。

3. 性能和场景上的区别
  • B树:适合频繁插入、删除的场景,但范围查询性能较差,因为数据分散在树的各层级中。

  • B+树:适合数据库这种需要频繁范围查询和排序的场景,因为所有数据都在叶子节点,并且叶子节点有序连接。


MySQL 为什么使用 B+树而不是 B 树

1. 范围查询效率高
  • B+树的优势:
    所有数据都在叶子节点,且叶子节点之间通过链表相连。

    • 例如:查询 id 在 [10, 50] 之间的数据,只需要找到 10 对应的叶子节点,然后顺序访问叶子节点直到 50,效率极高。
  • B树的问题:
    数据分散在所有节点(非叶子和叶子),范围查询时必须遍历整棵树,增加了磁盘IO开销。

2. 磁盘IO更少
  • B+树的优势:
    非叶子节点不存储数据,单个节点可以存储更多索引,提高了每次磁盘读取的数据量,从而减少磁盘IO次数。
3. 更适合顺序存储
  • B+树的设计:
    数据存储在叶子节点,顺序排列。范围查找和排序操作效率极高。
    • 例如:执行 ORDER BY 或 LIMIT 时,B+树通过叶子节点链表实现快速顺序读取。

通俗案例

场景:图书馆的书架管理

  • B树:

    • 图书可能被放在每一层架子上(非叶子和叶子节点都有书),查询时需要翻遍多个层架才能找到范围内的书。
  • B+树:

    • 图书都放在最底层的叶子架上,书架之间有顺序排列,书架之间还有连接链条,查询范围内的书时可以顺序扫描找到所有符合条件的书。

B+树的简单实现(Java 示例)

以下是一个简单的 B+ 树实现,重点关注插入和范围查询功能。


java

import java.util.ArrayList; import java.util.List; // B+树节点 class Node { boolean isLeaf; // 是否是叶子节点 List<Integer> keys; // 键值 List<Node> children; // 子节点指针(非叶子节点) Node next; // 指向下一个叶子节点(用于范围查询) Node(boolean isLeaf) { this.isLeaf = isLeaf; keys = new ArrayList<>(); children = new ArrayList<>(); next = null; } } // B+树 class BPlusTree { private final int degree; // 阶数 private Node root; public BPlusTree(int degree) { this.degree = degree; this.root = new Node(true); // 初始化为叶子节点 } // 插入方法 public void insert(int key) { Node current = root; if (current.keys.size() == degree - 1) { Node newRoot = new Node(false); newRoot.children.add(current); split(newRoot, 0); root = newRoot; } insertNonFull(root, key); } // 非满插入 private void insertNonFull(Node node, int key) { int i = node.keys.size() - 1; if (node.isLeaf) { while (i >= 0 && key < node.keys.get(i)) { i--; } node.keys.add(i + 1, key); } else { while (i >= 0 && key < node.keys.get(i)) { i--; } i++; Node child = node.children.get(i); if (child.keys.size() == degree - 1) { split(node, i); if (key > node.keys.get(i)) { i++; } } insertNonFull(node.children.get(i), key); } } // 节点分裂 private void split(Node parent, int index) { Node node = parent.children.get(index); Node sibling = new Node(node.isLeaf); int mid = degree / 2; parent.keys.add(index, node.keys.get(mid)); parent.children.add(index + 1, sibling); sibling.keys.addAll(node.keys.subList(mid + 1, node.keys.size())); node.keys = new ArrayList<>(node.keys.subList(0, mid)); if (!node.isLeaf) { sibling.children.addAll(node.children.subList(mid + 1, node.children.size())); node.children = new ArrayList<>(node.children.subList(0, mid + 1)); } else { sibling.next = node.next; node.next = sibling; } } // 范围查询 public List<Integer> rangeQuery(int start, int end) { List<Integer> result = new ArrayList<>(); Node current = root; while (!current.isLeaf) { int i = 0; while (i < current.keys.size() && start >= current.keys.get(i)) { i++; } current = current.children.get(i); } while (current != null) { for (int key : current.keys) { if (key >= start && key <= end) { result.add(key); } else if (key > end) { return result; } } current = current.next; } return result; } } public class Main { public static void main(String[] args) { BPlusTree bPlusTree = new BPlusTree(3); // 创建阶数为3的B+树 bPlusTree.insert(10); bPlusTree.insert(20); bPlusTree.insert(5); bPlusTree.insert(15); bPlusTree.insert(30); // 范围查询 System.out.println("范围查询结果:" + bPlusTree.rangeQuery(10, 20)); } }


代码解读

  1. 节点的定义:

    • 非叶子节点存储键值和子节点。
    • 叶子节点存储键值和链表指针(next)。
  2. 插入逻辑:

    • 如果节点满了(达到阶数上限),则进行分裂。
    • 非满节点直接插入。
  3. 范围查询:

    • 从根节点开始定位到叶子节点。
    • 从链表中顺序扫描符合范围的数据。

总结

  • B+树在范围查询和顺序遍历时效率更高,适合 MySQL 的索引需求。
  • Java 的 B+树实现可以用来模拟数据库中索引的插入和范围查询逻辑。
深入解析五大ADC芯片架构及其应用场景 本文深入解析了五大ADC芯片架构及其应用场景,包括逐次逼近型ADC、Σ-Δ型ADC、流水线型ADC、闪存型ADC和积分型ADC。通过详细的架构分析和实际应用案例,帮助工程师理解不同ADC芯片的特点和适用场景,提升电路设计效率。 阅读详情

相关推荐

Vue3项目实战:CKEditor5富文本编辑器从安装到隐藏不需要的功能

本文详细介绍了在Vue3项目中集成并深度定制CKEditor5富文本编辑器的完整流程。通过分析其模块化架构,指导开发者从标准构建出发,移除图片、表格等冗余插件,创建专属轻量构建,从而显著减小打包体积并提升用户体验。文章结合实战代码,涵盖了环境搭建、自定义构建配置、高级优化技巧等关键步骤。

weixin_29016833的博客 283

MySQL数据结构B树与B+树的区别

在树形数据结构中,叶子节点是指没有子节点的节点,也就是位于树结构末端的节点。叶子节点是树结构中最底层的节点,它们不再分支出其他节点,通常存储着实际的数据或信息。在一棵树中,除了叶子节点外,其他节点都可以称为内部节点。内部节点通常用来连接子节点或存储索引信息,而叶子节点则是存储实际数据或信息的地方。在B树或B+树这样的数据结构中,每个节点可以存储一定数量的关键字(或索引值),这个数量是固定的。非叶子节点存储的是用于导航到子节点的关键字,而叶子节点存储实际的数据记录或索引。

无人罪的博客 2128

STK之Commu模块之三仿真卫星通信链路参数计算

考虑上述衰减的影响,可以得到卫星接收机输入端的载波功 [C] = [PT] +[GT] +[GR] -[L] -[L1] -[L2] (

juanhuokang2681的博客 8267

Mysql数据库中b树和b+树的区别

在实际应用中,需要根据数据的特点和查询需求选择合适的索引结构。B树适用于随机读取和范围查询较多的场景,而B+树适用于范围查询较多的场景。需要注意的是,索引的创建和维护可能会增加写操作的开销,因此需要权衡索引的使用。同时,索引的选择也需要考虑到数据库的大小、查询频率等因素。MySQL数据库中,B树和B+树是常用的索引结构,用于提高数据检索的效率。它们在实现原理和适用场景上有一些区别。

牛肉胡辣汤 2148

LVGL按键触发回调函数的完整流程

如果是我的话我会怎么写:例如按键,我先定义一个结构体里面包含ID,事件名等和回调函数的链表节点结构体里面有具体函数的指针,也有指向下一个回调函数的链表节点的指针,初始化一个结构体变量的,通过BSP层来驱动触摸屏幕,再通过中间层与被按下时就会判断是长按还是短按还是其他,改变变量的事件例如:改成长按,生成事件包后再注册你长按的回调函数链表节点,再根据变量的事件到链表中遍历最后实现功能.父容器监听所有子列表项的点击事件,无需为每个列表项单独注册回调。的回调,打印所有事件日志,观察事件触发顺序。

solomonzw的博客 3239

基于Multisim设计电子密码锁

一、设计任务与要求:(可软件仿真实现)1)基本要求:设计一个数字密码锁,要求只有按正确的顺序,输入正确的密码,方能输出开锁信号,实现开锁。设置三个正确的密码键和若干个伪键,任何伪键按下后,密码锁都无法打开。每次只能接受四次按键信号,而且第四个键只能是“确定”或者“重输键”,其他无效。能显示已输入键的个数2)扩展要求:第一次密码输错后,可以输入第二次,但是连续三次输错,密码将被锁,必须按复位键才能解锁。

ablinger的博客 4416

一文彻底搞懂MySQL基础:B树和B+树的区别(简洁版)

B树和B+树都是多路搜索树,它们都用于数据库索引中存储和组织数据。B+树是B树的一种改进,它具有更好的插入和删除性能。

永远在路上 5861

SDA 还是 SDI:SAP HANA 数据虚拟化与数据集成的取舍、组合与实战

结论先放在前面:SDA 面向数据虚拟化与联邦查询,强调不落地、不复制、按需实时访问;SDI 面向数据集成与复制,强调抽取、转换、装载与近实时增量同步。两者共享 Remote Source 与 Adapter 的理念,但侧重点与运行时组件明显不同。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 583

b树和b+树的区别

一,b树b树(balance tree)和b+树应用在数据库索引,可以认为是m叉的多路平衡查找树,但是从理论上讲,二叉树查找速度和比较次数都是最小的,为什么不用二叉树呢? 因为我们要考虑磁盘IO的影响,它相对于内存来说是很慢的。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。所以我们要减少IO次数,对于树来说,IO次数就是树

login_sonata的博客 4万+

Python 爬虫实战:爬取 BOSS 直聘职位,实现岗位要求关键词提取

摘要:本文基于BOSS直聘数据分析师岗位信息,采用Python爬虫技术获取职位数据,通过文本分析和可视化方法研究岗位技能需求特征。研究首先设计爬虫程序获取职位基本信息和岗位要求文本,经数据清洗后运用jieba分词和词频统计提取关键词。结果显示SQL、Python为最核心技能,不同级别岗位需求差异明显:初级重基础数据处理,高级需建模和管理能力;行业间亦存在差异,互联网关注用户增长,金融侧重风控。研究为求职者技能提升提供了数据支持,同时展示了从非结构化文本中挖掘有价值信息的完整流程。

2503_91057718的博客 1765

Unet++改进33:添加ConvolutionalGLU(2024最新改进方法)|紧凑的网络结构和高效的运算

由于残差连接的深度退化效应,许多依赖堆叠层进行信息交换的高效视觉变形模型往往不能形成足够的信息混合,导致视觉感知不自然。为了解决这个问题,在本文中,我们提出了聚合注意力,这是一种基于仿生设计的令牌混合器,它模拟生物中央凹视觉和连续眼运动,同时使特征映射上的每个令牌具有全局感知。此外,我们结合了可学习的令牌,与传统的查询和键交互,这进一步多样化了亲和矩阵的生成,而不仅仅依赖于查询和键之间的相似性。我们的方法不依赖于堆叠进行信息交换,从而有效地避免了深度退化,实现了自然的视觉感知。

AIcurator的博客 683

B+树 和 跳表 的结构及区别,不同的用途【mysql的索引为什么使用B+树而不使用跳表?】

B+树 和 跳表 的结构及区别,不同的用途【mysql的索引为什么使用B+树而不使用跳表?】 详解B+树与跳表的结构及区别,描述B+树与跳表新增数据的过程,解释MySQL与Redis选择对应结构的原因。

小韩的博客 1790

华为OD技术面真题 - 数据库Redis - 1

汇总华为OD技术面真题Redis方面高频真题,提供详细解答。

qq_45776114的博客 934

B+树 和 跳表 的结构及区别,mysql的索引为什么使用B+树而不使用跳表?而redis为什么不用B+树结构而使用跳转

跳表是链表结构,一条数据一个结点,如果最底层要存放2kw数据,且每次查询都要能达到二分查找的效果,2kw大概在2的24次方左右,所以,跳表大概高度在24层左右。B+树是多叉平衡搜索树,扇出高,只需要3层左右就能存放2kw左右的数据,同样情况下跳表则需要24层左右,假设层高对应磁盘IO,那么B+树的读性能会比跳表要好,因此mysql选了B+树做索引。在105号数据页里,虽然有多行数据,但也不是挨个遍历的,数据页内还有个页目录的信息,它可以通过二分查找的方式加速查询行数据,于是找到id=5的数据行,完成查询。

weixin_50541844的博客 1360

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

为什么 MySQL索引要用 B+tree

文章目录前言索引查询为什么不采用二叉树为什么不采用 Hash 表为什么不采用红黑树B-treeB-tree 的查找B-tree 的插入B-tree 的删除情况一:直接删除叶子节点的元素情况二:删除叶子节点的元素后合并+旋转情况三:删除非叶子节点的元素后合并+旋转总结B+treeB+tree 和 B-tree 区别:B+tree的查找B+tree的插入B+tree的删除总结 前言 当你在遇到了一条慢 SQL 需要进行优化时,你第一时间能想到的优化手段是什么? 大部分人第一反应可能都是添加索引,在大多数情况下面

DreamsArchitects的博客 387

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

mysql的innodb索引数据结构是B+树,而不是hash?

一、基础 1.什么是聚簇索引? innodb中,主键的索引结构中,既存储了主键值,又存储了行数据。 2.B+树和B-树的区别? (1)B+树只有叶节点存放数据,其余节点用来索引; (2)而B-树是每个索引节点都会有Data域。 二、mysql的innodb索引数据结构是B+树,而不是hash? 1.哈希索引适用的场景 适合等值查询(前提是不存在大量重复键值,如果存在重复键就会出现哈...

Michaeles的博客 2113

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

为什么 MySQL 选择使用 B+ 树作为索引结构

摘要: B+树通过非叶节点仅存储键和指针的特性,减少树高度和磁盘IO,提升查询效率。其叶子节点构成链表,便于范围查询。相比B树,B+树查询更稳定,内存利用率更高。在MySQL中,三层B+树可存储约2000万条数据,适合大规模数据索引。

weixin_73916358的博客 192

B+树索引与Hash索引的区别

B+树索引与Hash索引的区别 B+(BTREE索引) B+树索引写成了BTREE的写法: CREATE TABLE t( aid int unsigned not null auto_increment, userid int unsigned not null default 0, username varchar(20) not null default ‘’, detail varch...

当你迷路时,放慢一下脚步 7082

索引的选择B树/B+树/B*树/LSM树

B树 多路平衡树,比二叉的查找次数少很多,做数据库索引时就能减少磁盘IO B+树 (SQL索引存储结构)叶子节点才存数据,并有指向相邻兄弟节点的指针;B+树的高度一般为2-4层,叶子节点存储的数据通常是一页(默认16k)或一页的整倍数(MySQL每次读取都是读一页)。 B*树 非叶子节点也有指向相邻兄弟节点的指针 跳表 很像B*树,它是平衡树的一种替代的数据结构,跳表对于树的平衡的实现是基于一种随机化的算法的,没有那么多约束,也就是说跳表的插入和删除的工作是比较简单的。 LSM树 (用于HBase,Leve

__一叶__的博客 565

多路查找树(B树,B+树)

目录 多路树理解 B树(B-Tree树) B+树 B+树应用场景 B和B+的区别 多路树理解 多路查找树(muitl-way search tree),其每一个节点的孩子数可以多于两个,且每一个节点处可以存储多个元素。(注意:二叉树是两个叉 ,多路树一个节点不止两个叉,不清楚的查看我【重温数据结构和算法】那篇博客) B树(B-Tree树) 是对二叉查找树的改进。它的设计思想是,将相关数据尽量集中在一起,以便一次读取多个 数据,减少硬盘操作次数。 一棵m阶的B 树 (m叉树)的特性如下:

illovesoftware的博客 740

MySQL索引及其结构(B+树)

索引:是为提高查询效率的数据结构; 索引分类 应用字段层次 单列索引=主键索引(非二级索引) + 唯一索引 + 普通索引 组合(联合)索引:多个字段组合上创建的索引 全文索引:类型为FULLTEXT,在varchar与text类型列上创建 数据储存方式 聚簇索引:Innodb中,即存了主键值,也存了行数据的主键索引; 非聚簇索引:MyISAM中索引和数据文件分开存储,所有都是非聚簇索引;当然Innodb的非主键索引也都是; 主键分 数据结构划分 ​ hash索引:MySQL不显式支持,只是作

m0_58104617的博客 329

MySQL数据库要用B+树存储索引吗,这个过程你应该没有察觉

前言 什么是索引 一键获取MySQL数据库资料文档 提起索引,大家都知道,建立索引可以让数据库查询更快,那么索引究竟是什么?我想这就不是每个人都能说得出来了。 索引,是数据库管理系统中一个排序的数据结构,并用以协助快速查询、 更新数据库表中数据。 是的,索引是一种数据结构,但是那么多的数据结构中为何MySQL要选择B+树呢?接下来就让我们一起来了解下B+树相对于其他数据结构有何独特之处! 二分查找法(Binary Search) 首先让我们自己想一想,如果让我们去设计,我们会怎么去存储?我想大部分人想到就是

m0_58479954的博客 229

MySql 索引原理以及B+树

B+ 树和 B 树区别: ①B+ 树非叶子节点上是不存储数据的,仅存储键值,而 B 树节点中不仅存储键值,也会存储数据。之所以这么做是因为在数据库中 页的大小是固定的,InnoDB 中页的默认大小是 16KB。如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点 树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的 IO 次数又会再次减少,数据查询的效率也会更快。 ②因为 B+ 树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的。那么 B+ 树使得范围查找,排序查找,分组查找

weixin_44325982的博客 219

B+Tree和BTree的区别

在BTree中每个节点保留了关键字(表的主键)、数据信息(表数据)、子节点内存地址信息。 而B+Tree中非叶子节点只保留了关键字以及子节点的内存地址信息,而叶子节点中还保留了数据信息,并且叶子节点之间以链表形式组织(如mysql的innodb以双向链表组织叶子节点)。 ...

z275598733的博客 919

concat走索引_MySQL学习之索引

主要从索引数据结构/ 聚簇索引/ 什么情况下不走索引等几方面概述索引的原理。索引数据结构MySQL通过B/B+树实现索引,B树是一种多路自平衡搜索树,它类似普通的二叉树,但是B书允许每个节点有更多的子节点。B树的特点:(1)所有键值分布在整个树中(2)任何关键字出现且只出现在一个节点中(3)搜索有可能在非叶子节点结束(4)在关键字全集内做一次查找,性能逼近二分查找算法从图中也可以看到,B+树与B树...

weixin_36359110的博客 2489

深入理解MySql索引底层数据结构与算法

一、索引本质 1、索引的本质 select * from t where col2 = 89 我们插入到数据表中的数据,有可能分布存储在磁盘不同的空间中,而我们的数据库查询的时候每次都要进行磁盘IO。当我们不加索引的时候,此时查询就是全表扫描,即一行一行的比对数据,多次进行磁盘IO,直到查询到我们所需的数据。 而我们所能想到的优化,自然是减少磁盘IO。而减少磁盘IO,我们自然是要减少数据比对的次数,即我们要在尽可能少的比对次数中,查询出我们需要的数据。 所以,我们可以考虑,能不能使用一中数据结构来存储数

沮丧的南瓜 486
上一篇: 常见数据结构和用途
下一篇: 计算机网络协议架构
sevevty-seven
博客等级 码龄2年 757粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值