浅浅谈一谈B树和B+树

简介: 浅浅谈一谈B树和B+树

目录:

🚀1.B树

🚀2.B+树

索引背后的数据结构是啥呢,是B+树,是为了数据库索引设计的,我们可以先了解B树,再说B+树


1.什么是B树

B树也叫B-树,这里的-不读减,是一个符号

我们已经学过了二叉搜素树,B树其实就是N叉搜素树,二叉搜索树只能在每一个结点放一个key,所以树的高度就很高,而N叉搜索树一个结点可以放多个key,高度大大降低,现在通过画图的形式来进行理解

51c38413065746aeace7c150aaf85bef.png


这就是一个B树,结点的子树越多,那么树的高度就越低,树的高度越低,那么访问硬盘的次数就越少,这有利于提高查询效率


什么是B+树


B+树也是N叉搜索树,其实有点像,但是还是有区别的,继续画图来看

6e16b3d8be0d40d1ba34b6a8eda60786.png


观察这个树,子结点中含有每个结点key的值

那么在查询的时候是以一个范围进行查询,B+树的最后一层的结点可以连接成一个单链表

如下图

就算查的数字在这个树里没有,那么只要通过范围圈出链表的一个范围即可


B+树实现了数据库的索引,那么举个例子,假如要插入一个学生,有id,name,number,address,等,


在B树中就相当于每一个结点的key值中存着这一行数据,比如30,就存着这个学生的所有数据,那么假如就要查30,就查到第一层就可以了,


如果是B+树,那么除了最后一层的结点是存储完整数据的,其他结点是不存该学生的所有信息的,只会存ID,那查询的时候必须查到最后一层才能拿到完整的数据


那么如果没有id ,那就不能使用索引了,因为使用B+树的前提是可比较的key值


在这个结构中,默认是id作为表主键的,


那么如果一个表里有多个索引呢,id是主键索引,那么针对name 也有一个索引


在建造B+树的时候还是按照id为主键建的,在叶子结点中有所有数据


针对name 这个索引,我们需要再创建一个B+树,这个树的叶子结点不保存完整数据,只保存id,在根据name查询的时候,只能查到id,还需要到以id为主键为索引创建的B+树中,再次查询,查到这个树里的叶子结点,才可以查到完整数据


这就叫回表过程,是由mysql自动完成的.


B+树就是mysql组织数据的方式


一张表的结构可能是表结构,也可能是树结构,取决于有没有索引,以及数据库使用的存储引擎


说了这么多,来总结一下


先来说一下B+树的特点

1.一个结点,可以存储N个key,N个key划分N个区间(B树划分的是N+1个区间)

2.每个结点的key的值都会在叶子结点中存在

3.B+树的叶子结点是首尾相连的,类似链表

4.只会在叶子结点上存储完整的行数据,非叶子结点只有key值

现在来说一说B+树的优点


1.一个结点可以存更多的key值,那么树的高度更矮,减少访问硬盘次数

2.所有的查询都会落到叶子结点上(访问的IO次数是一样的,这里的IO次数是指硬盘访问次数)

3.B+树的所有叶子结点构成一个链表,方便范围查询

4.完整的数据都存在叶子节点上,非叶子结点只会存储key,这些非叶子结点可能会存储在

内存中,那么又进一步减少了硬盘访问次数


B树的特点


1.一个结点可以存N个key值,N个key划分N+1个区间

2.每个结点都存储完整的行数据


3.每个结点的key的值在叶子结点中不会出现

4它的叶子结点不存在首尾相连的链表关系

B树的优点


1..一个结点可以存更多的key值,那么树的高度更矮,减少访问硬盘次数

2.所有的查询会落到每一个结点上,查询的速度也很快

今天的讲解就到这里,我们下期见





相关文章
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
12月前
|
Web App开发 前端开发 测试技术
你可能对position和z-index有一些误解
该文章深入解析了CSS中`position`属性的各个取值(static、relative、absolute、fixed、sticky)的使用场景及`z-index`在层叠上下文中如何确定元素的堆叠顺序,并通过具体例子展示了这些属性的实际应用效果。
你可能对position和z-index有一些误解
|
监控 前端开发 网络协议
HTTP - 长连接 & 短连接 & 长轮询 & 短轮询 & 心跳机制
HTTP - 长连接 & 短连接 & 长轮询 & 短轮询 & 心跳机制
3165 0
HTTP - 长连接 & 短连接 & 长轮询 & 短轮询 & 心跳机制
Go 项目自动重载解决方案 —— Air 使用入门
**Air**: 提升Go开发效率的利器!自动重载工具,监听文件变化,实时编译运行,无需频繁重启。安装:启用Go Module后,运行`GO111MODULE=on go install github.com/cosmtrek/air@latest`。启动项目:`air`,配置文件默认为`air.toml`。集成到项目,忽略`tmp/`目录。让代码更改即时生效,专注编码,告别手动重启。适用于开发环境,生产环境禁用。[更多详情](https://github.com/cosmtrek/air)
251 1
|
编解码 开发工具 Android开发
rtmp/rtsp直播播放器选择
相信大家在做rtmp、rtsp直播的时候,最大的困惑就是选个靠谱的播放器,直播的延迟,一定意义上说,90%的取决于播放器的好坏。
403 0
|
10月前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
12月前
|
人工智能 算法 测试技术
软件测试中的人工智能:提升测试效率与质量
随着软件开发的快速发展,传统的手工测试方法已经无法满足现代软件项目的需求。本文探讨了人工智能在软件测试中的应用,如何通过自动化测试、智能缺陷分析和测试用例生成等技术,提高测试效率和质量。我们将详细介绍这些技术的原理和实际应用,并讨论其带来的优势和挑战。
618 4
|
存储 Java 开发者
使用Spring Boot 3.3全新特性CDS,启动速度狂飙100%!
【8月更文挑战第30天】在快速迭代的软件开发周期中,应用的启动速度是开发者不可忽视的一个重要指标。它不仅影响着开发效率,还直接关系到用户体验。随着Spring Boot 3.3的发布,其中引入的Class Data Sharing(CDS)技术为应用的启动速度带来了革命性的提升。本文将围绕这一全新特性,深入探讨其原理、使用方法以及带来的实际效益,为开发者们带来一场技术盛宴。
770 2
|
开发者 C# 存储
WPF开发者必读:资源字典应用秘籍,轻松实现样式与模板共享,让你的WPF应用更上一层楼!
【8月更文挑战第31天】在WPF开发中,资源字典是一种强大的工具,用于共享样式、模板、图像等资源,提高了应用的可维护性和可扩展性。本文介绍了资源字典的基础知识、创建方法及最佳实践,并通过示例展示了如何在项目中有效利用资源字典,实现资源的重用和动态绑定。
367 0
|
算法 安全 Linux
Ctfshow web入门 PHP特性篇 web89-web151 全(二)
Ctfshow web入门 PHP特性篇 web89-web151 全(二)
341 0