【数据结构】通过对比二叉查找树、平衡二叉树和B树,对MySQL中的B+树讲解

server/2024/11/26 20:50:18/

从二叉查找树到B+树的演进

通过对比二叉查找树平衡二叉树B树B+树,从简单到复杂,逐步帮助理解B+树的特点及优势。


1. 二叉查找树(Binary Search Tree, BST)

二叉查找树是一种简单的树结构,特点是每个节点最多有两个子节点:

  • 左子树:所有节点值小于根节点。
  • 右子树:所有节点值大于根节点。

特点

  • 查询时间复杂度:
    • 平均情况:(O(log n))
    • 最差情况:(O(n))(当树退化为链表时)
  • 数据存储位置:数据存储在每个节点中。

示例图

        10/  \    5   20    / \    \    3   7    30    

缺点

  • 树容易变得不平衡,影响查询效率。

2.平衡二叉树(Balanced Binary Tree, AVL Tree)

平衡二叉树在二叉查找树的基础上,通过旋转操作保持树的平衡。

特点

  • 始终保持查询复杂度为
  • O(log n)
  • 数据存储位置:和二叉查找树相同,数据存储在每个节点中。
  • 插入和删除操作时,可能需要通过旋转来维持平衡。

示例图

        10/   \       5     20       / \     / \       3   7  19  30       

缺点

  • 对频繁插入/删除操作不友好,调整成本高。

3.B树(B-Tree)

B树是多路平衡树,特点是每个节点可以存储多个键值。
B树的阶数m:每个节点最多包含 m-1 个键值,最多有 m 个子节点。
在这里插入图片描述

特点

  • 树高度较低:相比二叉树,B树每个节点存储多个键值,减少树的高度。
  • 数据存储分布:数据存储在非叶子节点和叶子节点中。
  • 磁盘优化:每个节点通常对应一个磁盘页,减少磁盘I/O。

缺点

  • 数据存储在非叶子节点和叶子节点中,范围查询效率不如B+树。

4.B+树(B+ Tree)

B+树是对B树的进一步优化:

  • 非叶子节点:只存储键值,用于索引。
  • 叶子节点:存储所有数据,并按照大小顺序排列,叶子节点之间用链表连接。

特点

  • 查询效率:时间复杂度为(O(log n))
  • 数据存储分布
  • 非叶子节点:只存储键值,用于索引。
  • 叶子节点:存储所有数据,并按顺序排列。
  • 磁盘优化:节点存储多个键值,充分利用磁盘页预读特性。
  • 适用场景:数据库索引、文件系统等。
    在这里插入图片描述

特性二叉查找树平衡二叉树B树B+树
树的阶数22m > 2m > 2
节点存储1个键值1个键值多个键值多个键值
数据存储位置所有节点所有节点所有节点仅叶子节点
范围查询效率不高不高较高非常高
树的高度较高较高较低最低
适用场景内存中简单查找内存中高效查找数据库、磁盘系统数据库、文件系统优化

每层节点的存储能力

  • 根节点:存储 1000 个键值,可以指向 1001 个子节点。
  • 中间节点:每个节点可以存储 1000 个键值,并指向 1001 个下一层节点。
  • 叶子节点:最终存储实际数据,每个节点可以存储 1000 条记录。

3层 B+树的计算

  1. 第一层(根节点):根节点最多可以指向1000个键值(节点数)。
  2. 第二层(中间层):每个中间节点又可以指向1000个键值,总共有1000×1000=
    1,000,000个键值(节点数)。
  3. 第三层(叶子节点):叶子节点每个可以存储1000条实际数据,总共有1000×1000×
    1000=1,000,000,000条数据。

3层 B+树的存储总量

3层 B+树的存储总量就是叶子节点的总存储量,所以这里的计算结果是 10亿条数据


b+树可视化https://bplustree.app/


http://www.ppmy.cn/server/145144.html

相关文章

单片机结合OpenCV

目录 一、引言 二、单片机结合 OpenCV 的优势 1. 图像识别与处理 2. 目标检测 3. 用户界面开发 4. Linux 在嵌入式系统中的作用 5. 多线程优势 6. 网络编程作用 7. 文件编程功能 三、OpenCV 在单片机上的实现难点 1. 处理能力限制 2. 通信与优化挑战 四、单片机如…

Python 爬虫从入门到(不)入狱学习笔记

爬虫的流程:从入门到入狱 1 获取网页内容1.1 发送 HTTP 请求1.2 Python 的 Requests 库1.2 实战:豆瓣电影 scrape_douban.py 2 解析网页内容2.1 HTML 网页结构2.2 Python 的 Beautiful Soup 库 3 存储或分析数据(略) 一般爬虫的基…

Java项目实战II基于微信小程序的图书馆自习室座位预约平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在知识爆炸的时代,图书馆和…

ISUP协议视频平台EasyCVR萤石设备视频接入平台银行营业网点安全防范系统解决方案

在金融行业,银行营业厅的安全保卫工作至关重要,它不仅关系到客户资金的安全,也关系到整个银行的信誉和运营效率。随着科技的发展,传统的安全防护措施已经无法满足现代银行对于高效、智能化安全管理的需求。 EasyCVR视频汇聚平台以…

centos7.9搭建k8s集群

环境准备 centos7.9,8G4C 准备工作: 关闭防火墙firewalld、selinux 设置主机名 设置/etc/hosts [rootlocalhost ~]# hostnamectl set-hostname master [rootlocalhost ~]# hostnamectl set-hostname worker1 [rootlocalhost ~]# hostnamectl set-hostname w…

MySQL通过binlog恢复数据

查看记录二进制日志详细信息 SHOW VARIABLES LIKE %log_bin% log_bin 为 ON说明这个参数是开启的,就是说系统是记录了bin log的 log_bin_basename 配置了bin log的文件路径及文件前缀名 log_bin_index 配置了bin log索引文件的路径 查看当前使用日志列表 show …

44.扫雷第二部分、放置随机的雷,扫雷,炸死或成功 C语言

按照教程打完了。好几个bug都是自己打出来的。比如统计周围8个格子时,有一个各自加号填成了减号。我还以为平移了,一会显示是0一会显示是2。结果单纯的打错了。debug的时候断点放在scanf后面会顺畅一些。中间多放一些变量名方便监视。以及mine要多显示&a…

《硬件架构的艺术》笔记(五):低功耗设计

介绍 能量以热量形式消耗,温度升高芯片失效率也会增加,增加散热片或风扇会增加整体重量和成本,在SoC级别对功耗进行控制就可以减少甚至可能消除掉这些开支,产品也更小更便宜更可靠。本章描述了减少动态功耗和静态功耗的各种技术。…