IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【数据库专题】一文搞懂 B+树凭什么成为关系型数据库索引的主流数据结构 -> 正文阅读

[数据结构与算法]【数据库专题】一文搞懂 B+树凭什么成为关系型数据库索引的主流数据结构

一、非B+树不可吗?

数据库最常用的两个功能就是“等值查询”和“范围查询”。如果只是为了满足“等值查询”,那么Hash散列表和平衡二叉查找树都能胜任数据库索引这个使用场景,但是“范围查询”却加大了难度,使得它们不太适合了。

在原先讲过的“跳表”倒是很契合,但实际场景中,大家都是使用的B+树。

二、二叉树演变B+树过程

二叉树我们前面也都了解过了,我们来看下,用它来作为索引的数据结构会存在什么问题?首先它是能够满足“等值查询”的,但是无法进行“范围查询”,所以,我们需要对其进行改造:

  • 树中的每个节点都不存储具体的数据,而是存储索引;
  • 叶子节点从左到右用双向链表绑定起来;

改造前后的二叉树结构示意图如下:

二叉树改造前后示意图

改造后的好处是:

  • 只是存储索引的话,使得二叉树的大小不会很大;
  • 叶子节点使用双向链表串起来之后,就可以进行范围查找了;
  • 等值查找的时间复杂度还是树高O(logn);

看上去还不错,但是实际使用时有问题,因为我们数据库中需要存储的数据实在是非常多,如果使用这样的改造后的二叉树,树的高度将是非常惊人的。不但查找起来非常缓慢,而且这么多节点全部加载到内存中也是不现实的。

我们再次进行如下的改造:

  • 只把所有索引树的根节点放入到内存中,其它子节点都放到磁盘上;
  • 将二叉树改造为m叉树,每个节点的子节点个数最多为m个,如此树的高度就大大降低了,减少了IO磁盘查找的次数;
  • 每个子节点的大小不能超过一页的大小,通常为4kb,保证m最大的同时,OS单次读页就能将该节点加载完毕;

改造后的数据结构示意图如下:

B+树改造示意图

改造后的好处是:

  • 没有把索引树的全部节点加载到内存,减少了内存的压力;
  • m叉树使得索引树的高度尽可能降低了,减少了IO查找节点的次数,提高了时间效率;
  • m取值有了理论依据,使得时间效率最大化;

但同时也有部分缺点:

  • 数据的写入和删除都会导致索引的更新,从而需要更改索引树;
  • 当插入数据的时候,如果某个节点的子节点个数超过m,就需要分裂,极端情况下,需要从下往上传导分裂;
  • 当删除数据的时候,如果某个节点的个数小于m/2,则需要合并节点,否则这样的节点多了,影响查询效率;

三、B+树总结

  • 每个节点中的子节点个数不能超过m,不能小于m/2;
  • 根节点的子节点个数可以小于m/2,但是不能超过m;
  • 每个节点只存储索引,并不存储数据;
  • 所有叶子节点都是双链表串联的,方便范围查找;
  • 根节点会被存储在内存中,其它节点存储在磁盘中;

四、和B树的关系

B+树是在B树的基础上改进的,B树中每个节点是存储真实的数据的,所以整个树会很大;B树的叶子节点是没有用链表串联的,所以还是无法满足范围查找的场景;因此,B树其实就是一个子节点不能小于m/2的m叉树;

B+树和B树的关系,以及MySQL中不同存储引擎数据结构的不同可以参考《【数据库专题】如何理解数据库的索引?》

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-06-14 22:53:04  更:2022-06-14 22:54:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:23:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码