数据结构--B树、B+树

news2024/10/7 6:50:38

数据结构--B树、B+树

  • 1. 什么是B树
  • 2.建立B树的要求
  • 3.什么是B+树
  • 4.Mysql里面为什么使用B+树作为索引结构?

1. 什么是B树

B树是一种数据结构,用于在硬盘或其他非易失性存储介质上快速存储和访问大量数据。它是一种平衡树,其每个节点可以存储多个键值对,而不仅仅是一个。B树通常用于需要频繁读写的数据库或文件系统中,因为它可以减少磁盘的访问次数,从而提高了性能。

B树有以下几个特点:

  • 每个节点可以存储多个键值对。这个数量通常称为节点的度数(degree)。
  • 所有叶节点都在同一层级上。这有助于保持树的平衡,使得在任何一个节点到达叶子节点的路径长度都相同。
  • 节点中的键值对是按照某种顺序排列的。这使得查找操作更加高效。
  • B树的高度相对于存储的关键字数来说非常小。因此,可以较快地定位到任何一个关键字。

一些常见的变体包括B+树和B*树,它们具有不同的性能特征和应用场景。
【动画版】数据结构-B树

在这里插入图片描述

2.建立B树的要求

建立B树的要求包括:

  1. 确定节点的度数:B树的节点可以存储多个关键字。度数是指每个节点最多可以存储的关键字数量。

  2. 确定关键字的排列方式:在节点中存储的关键字必须按照一定的方式进行排序,以便于查找和插入操作的执行。通常使用升序排列。

  3. 确定B树的最小度数:B树的最小度数定义为需要保证每个非根节点至少有t个关键字。根节点至少有一个关键字。

  4. 确定B树的最大度数:B树的最大度数定义为节点最多可以存储2t-1个关键字。根节点最多可以存储2t个关键字。

  5. 确定B树的高度:B树的高度应该尽可能小,以便于快速查找和插入。高度的计算公式为h <= logt(n+1),其中n为节点中关键字的数量,h为树的高度。

  6. 确定节点的分裂和合并规则:当一个节点的关键字数超过2t-1时,需要将它分裂成两个节点。如果一个节点的关键字数少于t-1时,则需要将它与相邻的节点合并成一个节点。

在实际应用中,我们可以通过递归算法实现B树的构建和操作。

3.什么是B+树

B+树是B树的一种变体结构,它与B树的不同之处在于:

  1. 只有叶子节点存储关键字:B+树中所有的内部节点仅用来索引,不存储具体的数据记录,只有叶子节点中才存储数据记录。这种特性使得B+树的磁盘读取更加高效,因为每个节点可以存储更多的索引。

  2. 叶子节点之间有指针相连:所有的叶子节点之间通过指针相连,形成一个有序链表。这个链表可以方便地支持范围查询,而且可以快速遍历整个数据集。

  3. 叶子节点的大小固定:所有的叶子节点都是同样大小的,因此可以预先分配好磁盘空间,避免频繁的磁盘动态分配。

B+树适用于需要频繁进行范围查询的场景,例如数据库系统中的索引。它可以利用叶子节点之间的有序链表,快速定位到满足条件的数据记录,并且具有更好的磁盘读取性能。

在这里插入图片描述

4.Mysql里面为什么使用B+树作为索引结构?

常规的索引引擎都会使用B树或者B+树作为索引引擎,因为B树是一种多路平衡树,用这种存储结构来存储大量数据的情况下,整体高度相比于二叉树来说会矮很多,而对于数据库来说所有的数据必然是存储在磁盘上的,而磁盘IO的效率实际上是很低的,特别是在随机磁盘IO的一个情况下,效率更低,所以树的高度就能够决定磁盘IO的一个次数,磁盘IO次数越少对性能的提升就越大。这也是为什么采用B树作为索引存储结构的原因。
但是在Mysql的Innodb存储引擎中,它采用的是一种增强的B树结构,B+树相比较于B树,B+树做了如下几个方面的优化。

  1. B+树的所有数据都存储在叶子节点上,非叶子节点只存储索引。(B+树非叶子节点不存储数据,所以每一层能够存储的索引数量会增加,因为着B+树在层高相同的情况下存储的数据量要比B树要多,使得磁盘IO次数更小)。
  2. 叶子节点中的数据使用双向链表进行关联。(Mysql中范围查询是一个比较常用的操作,而B+树的所有存储在叶子结点的数据使用了双向链表进行关联,所以在查询的时候只需要两个节点进行遍历就行,而B书需要获取所有节点,所以B+树在范围查询的效率上更高)。
  3. 在数据检索方面由于所有的数据都存储在叶子节点,所以B+树的IO次数会更加稳定一些。
  4. 因为叶子结点存储所有数据所以B+树的全局扫描能力更强一些,因为它只需要扫描叶子节点,但是B树需要遍历整个树。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/443345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

zabbix SNMP traps 监控案例

目标 根据H3C网络设备 发送 SNMP trap 信息进行网络端口的告警。 具体过程 继上次配置的trap 方式进行监控一个案例。 其中log数据中的内容是&#xff1a; 20230330.163810 ZBXTRAP 192.168.21.148 UDP: [192.168.21.148]:52289->[172.18.18.2]:1162 DISMAN-EVENT-MIB::…

Keil5软件安装方法(兼容stm32与c51方法)

目录 一、下载软件包 二、安装软件 1、安装C51v960a.exe (1&#xff09;右键以管理员权限运行程序 &#xff08;2&#xff09;开始安装软件 &#xff08;3&#xff09;勾选协议 &#xff08;4&#xff09;选择安装路径 &#xff08;5&#xff09;填写名字与邮箱 &#xff0…

我国元宇宙行业分析:政策、技术、资金助推行业探索多元化应用场景

1.元宇宙行业概述、特征及产业链图解 元宇宙是人类运用数字技术构建的&#xff0c;由现实世界映射或超越现实世界&#xff0c;可与现实世界交互的虚拟世界&#xff0c;具备新型社会体系的数字生活空间&#xff0c;主要具有沉浸式体验、开放性、虚拟身份、不断演化、知识互动、…

c/c++:指针,指针定义和使用,指针大小4字节,野指针,空指针*p=NULL

c/c:指针&#xff0c;指针定义和使用&#xff0c;指针大小4字节&#xff0c;野指针&#xff0c;空指针*pNULL 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;此时学会c的话&#xff0c; 我所知道的周边的会c的同学&#xf…

VMware开机自启虚拟机系统

一、前提 wmware开机自启&#xff0c;安装完毕wmware不用管&#xff0c;默认该软件以及相关服务就是开机自启准备waware虚拟机&#xff08;一般都linux&#xff0c;我用centos7&#xff0c;你随意&#xff09; 二、脚本 脚本命令如下&#xff0c;等待30秒&#xff08;给服务自启…

NXP公司K20+PF8100实现硬件窗口看门狗

Kinetis K20 72 MHz MCU系列为中等性能的Kinetis产品组合提供了可扩展的入门级产品&#xff0c;具有差异化的集成&#xff0c;配备高精度模拟集成和灵活的低功耗功能。其相关资源可在NXP的官网获得。 PF81/PF82为PMIC系列专为高性能处理应用而设计&#xff0c;如娱乐中控、车载…

阅读完synchronized和ReentrantLock的源码后,我竟发现其完全相似

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…

【数据结构】七大排序之快速排序详解(挖坑法快排,非递归快排,二路快排,三路快排)

目录 1.快速排序核心思路 2.挖坑法快速排序&#xff08;递归&#xff09; 2.1步骤 2.2代码&#xff08;详细注释&#xff09; 3.非递归快排&#xff08;用栈实现快速排序&#xff09; 3.1思路 3.2代码 4.二路快排 4.1思路 4.2代码 5.三路快排 5.1思路 5.2代码 1.快速…

大白话chatGPT及其原理之快速理解篇

大白话chatGPT及其原理之快速理解篇 从GPT名字理解chatGPTchatGPT三步曲 声明&#xff1a;本文为原创&#xff0c;未经同意请勿转载&#xff0c;感谢配合&#x1f604; chatGPT今年年初的时候是非常火爆的&#xff0c;现在也有很多相关的应用和插件。当然现在也有很多新的技术出…

老宋 带你五分钟搞懂vue

Vue 1.1 什么是框架 任何编程语言在最初的时候都是没有框架的&#xff0c;后来随着在实际开发过程中不断总结『经验』&#xff0c;积累『最佳实践』&#xff0c;慢慢的人们发现很多『特定场景』下的『特定问题』总是可以『套用固定解决方案』。于是有人把成熟的『固定解决方案…

袋鼠云春季生长大会圆满落幕,带来数实融合下的新产品、新方案、新实践

4月20日&#xff0c;以“数实融合&#xff0c;韧性生长”为主题的袋鼠云春季生长大会圆满落幕。 在春季生长大会中&#xff0c;袋鼠云带来了数实融合趋势下的最新行业沉淀、最佳实践经验和行业前瞻性的产品发布。从大数据基础软件“数栈”、到低代码数字孪生世界“易知微”&…

离散数学-考纲版-01-命题逻辑

文章目录 1. 命题逻辑的等值演算与推理演算参考1.1 命题1.2 常用联结词1.3 命题公式命题公式的分类-重言式-矛盾式-可满足式等价关系式-逻辑等价 logically equivalent 1.4 命题的等值演算与推理基本等价式逻辑蕴涵重言式 logically implication重言蕴涵推到归结法 1.5 命题公式…

log4j2日志简单使用

log4j2日志使用 1、log4j2介绍 Apache Log4j2是对Log4j的升级版&#xff0c; log4j2借鉴了logback的一些优秀的设计&#xff0c;并且修复了一些问题&#xff0c;因此带来了一些重大的提升&#xff0c;主要有&#xff1a; 1、异常处理&#xff1a;在logback中&#xff0c;Appe…

Makefile通用模板

工程目录 假如我们有以下目录结构&#xff1a; . ├── inc │ ├── add.h │ └── sub.h ├── main.c └── src├── add.c└── sub.c文件中的内容如下&#xff1a; //main.c #include <stdio.h> #include "add.h" #include "sub.h&q…

Mysql 学习(六)Mysql的数据目录

数据库中数据的存放 Mysql中 InnoDB 和 MyISAM 这样的存储引擎都是把数据存储到磁盘上的&#xff0c;而我们把这种存放到磁盘上的东西叫做文件系统&#xff0c;当我们想读取对应数据的时候&#xff0c;就会把数据从文件系统上加载&#xff0c;并且处理返回给我们&#xff0c;当…

每日学术速递4.19

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Visual Instruction Tuning 标题&#xff1a;可视化指令调优 作者&#xff1a;Haotian Liu, Chunyuan Li, Qingyang Wu, Yong Jae Lee 文章链接&#xff1a;https://arxiv.org/ab…

Midjourney:一步一步教你如何使用 AI 绘画 MJ

一步一步如何使用 Midjourney 教程&#xff1a;教学怎么用 MJ&#xff1f; 一、Midjourney&#xff08;MJ&#xff09;是什么&#xff1f; Midjourney是一款使用文字描述来生成高质量图像的AI绘画工具。这篇文章主要介绍了Midjourney及其用途&#xff0c;并针对Midjourney的使…

python 定时任务执行命令行

1.使用场景&#xff1a; 定时执行jmeter脚本&#xff0c;通过python定时器隔一段时间执行命令行命令。 2.库&#xff1a; os、datetime、threading &#xff08;1&#xff09;利用threading.Timer()定时器实现定时任务 Timer方法说明Timer(interval, function, argsNone, k…

如何利用python实现TURF分析?

1.TRUF分析简介 TURF分析(Total Unduplicated Reach and Frequency)是累计净到达率和频次分析的简称。最初被应用于媒介研究领域。典型应用场景是&#xff0c;在既定条件下&#xff0c;例如预算等资源限制或就当前实施的媒体组合投放计划&#xff0c;哪些渠道组合能让广告投放…

【三十天精通Vue 3】第十二天 Vue 3 过滤器详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录 引言一、Vue 3 过滤器概述1.1 过滤器的简介1.2 过滤器的作用1.3 过…