MySQL为什么使用B+树?B+树和B树的区别

server/2025/1/24 21:12:33/

MySQL为什么使用B+树?B+树和B树的区别

在数据库系统中,索引是提高数据检索效率的关键技术。MySQL 默认使用 B+树 作为索引的数据结构,而不是 B 树或其他数据结构。这是因为 B+树在范围查询、磁盘 I/O 效率以及数据存储方式等方面具有显著优势。在这里插入图片描述


B+树和 B 树的区别

B+树和 B 树都是平衡多路搜索树,但它们在设计上有一些关键差异,这些差异直接影响了它们在数据库中的应用。

1. 数据存储位置
  • B 树:
    • 每个节点(包括非叶子节点和叶子节点)都存储数据(索引 + 记录)。
    • 数据分布在整棵树的各个节点中。
  • B+树:
    • 只有叶子节点存储实际数据(索引 + 记录),非叶子节点仅存储索引(键值)。
    • 数据集中在叶子节点,非叶子节点仅用于导航。
2. 叶子节点的结构
  • B 树:
    • 叶子节点和非叶子节点的结构相同,都存储数据。
    • 叶子节点之间没有直接链接。
  • B+树:
    • 叶子节点之间通过指针连接,形成一个有序链表。
    • 这种结构使得范围查询更加高效。
3. 索引的重复性
  • B 树:
    • 非叶子节点的索引只出现一次,不会在子节点中重复出现。
  • B+树:
    • 非叶子节点的索引会重复出现在子节点中,并且是子节点中所有索引的最大值(或最小值)。
4. 节点子节点与索引的关系
  • B 树:
    • 非叶子节点的子节点数量比索引数量多 1。
  • B+树:
    • 非叶子节点中有多少个子节点,就有多少个索引。

MySQL 为什么使用 B+树?

MySQL 选择 B+树作为索引结构的主要原因在于其高效的范围查询能力、磁盘 I/O 优化以及更适合数据库场景的设计。

1. 范围查询的高效性
  • B+树:
    • 叶子节点之间通过指针连接,形成一个有序链表。
    • 当进行范围查询时(如 WHERE id BETWEEN 10 AND 100),只需要找到起始位置的叶子节点,然后沿着链表顺序遍历即可。
    • 这种设计使得范围查询的时间复杂度接近 O(log n + m),其中 n 是索引数量,m 是范围查询的结果数量。
  • B 树:
    • 由于数据分布在所有节点中,范围查询需要多次中序遍历整棵树,效率较低。
2. 磁盘 I/O 优化
  • B+树:
    • 非叶子节点仅存储索引,不存储实际数据,因此每个节点可以存储更多的键值。
    • 这使得 B+树的层数更少,查询时需要访问的磁盘块更少,减少了磁盘 I/O 次数。
  • B 树:
    • 每个节点都存储数据,导致节点能存储的键值较少,树的高度较高,查询时需要更多的磁盘 I/O。
3. 更适合数据库场景
  • B+树:
    • 数据集中在叶子节点,非叶子节点仅用于导航,这种设计非常适合数据库的索引需求。
    • 叶子节点的有序链表结构非常适合范围查询和排序操作,而这些操作在数据库中非常频繁。
  • B 树:
    • 数据分布在整个树中,适合随机查询,但在范围查询和排序操作上效率较低。
4. 更高的空间利用率
  • B+树:
    • 非叶子节点不存储实际数据,可以存储更多的索引,空间利用率更高。
  • B 树:
    • 每个节点都存储数据,空间利用率较低。

B+树和 B 树的对比总结

特性B 树B+树
数据存储位置所有节点都存储数据只有叶子节点存储数据
叶子节点结构叶子节点之间没有链接叶子节点通过指针连接,形成有序链表
范围查询效率较低,需要中序遍历整棵树较高,只需遍历叶子节点链表
磁盘 I/O 次数较多,树的高度较高较少,树的高度较低
空间利用率较低,每个节点都存储数据较高,非叶子节点仅存储索引
适用场景适合随机查询适合范围查询和排序操作

示例说明

假设有一个包含 100 万条记录的表,字段 id 是主键,使用 B+树索引。

  1. 查询单个记录:

    • 通过 B+树的索引结构,可以快速定位到叶子节点,时间复杂度为 O(log n)。
    • 由于 B+树的层数较少,磁盘 I/O 次数也较少。
  2. 范围查询:

    • 查询 WHERE id BETWEEN 1000 AND 2000
      • 首先找到 id = 1000 的叶子节点。
      • 然后沿着叶子节点的链表顺序遍历,直到 id = 2000
    • 这种操作非常高效,因为不需要回溯到非叶子节点。

B+树 vs B 树
数据存储位置
叶子节点结构
范围查询效率
磁盘 I/O 次数
空间利用率
适用场景
B 树: 所有节点存储数据
B+树: 只有叶子节点存储数据
B 树: 叶子节点无链接
B+树: 叶子节点形成有序链表
B 树: 范围查询效率低
B+树: 范围查询效率高
B 树: 磁盘 I/O 次数多
B+树: 磁盘 I/O 次数少
B 树: 空间利用率低
B+树: 空间利用率高
B 树: 适合随机查询
B+树: 适合范围查询和排序

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

相关文章

08-ArcGIS For JavaScript-通过Mesh绘制几何体(Cylinder,Circle,Box,Pyramid)

目录 概述代码实现1、Mesh.createBox2、createPyramid3、Mesh.createSphere4、Mesh.createCylinder 完整代码 概述 对于三维场景而言,二位的点、线、面,三维的圆、立方体、圆柱等都是比较常见的三维对象,在ArcGIS For JavaScript中我们知道点…

【技术洞察】2024科技绘卷:浪潮、突破、未来

涌动与突破 2024年,科技的浪潮汹涌澎湃,人工智能、量子计算、脑机接口等前沿技术如同璀璨星辰,方便了大家的日常生活,也照亮了人类未来的道路。这一年,科技的突破与创新不断刷新着人们对未来的想象。那么回顾2024年的科…

软键盘显示/交互问题

日常开发会经常遇到软键盘覆盖界面布局的问题,比如:我有一个fragment,中心布局了EditText,正常情况是 ,当点击这个EditText的时候,输入法会弹出来,但是输入控件会覆盖掉EditText,看不到输入的内容,这种应该怎么处理呢 这个问题通常是因为当软键盘弹出时,EditText 被…

【Qt】事件

事件 事件的处理鼠标事件键盘事件定时器窗口事件 用户进行的各种操作,就会产生事件。给事件关联上函数或处理逻辑,当事件触发时,就能执行对应的代码。多数场景下,程序和用户的交互可以通过 “信号槽” 完成,但在某些特…

《罗宾逊-旅途VR》Build2108907官方学习版

《罗宾逊-旅途VR》官方版 https://pan.xunlei.com/s/VODiY5gn_fNxKREdVRdwVboCA1?pwdsh3f# 从第一人称的角度进行探索,玩家将遇到一系列恐龙和生物,这些恐龙和生物会对它们在泰森三世生态系统中的存在做出反应。强调与周围环境的互动,鼓励玩…

Selenium-WEB自动化测试环境配置

Selenium-WEB-Python-Mac开发环境 一、安装selenium 打开终端 ->pip安装(安装命令:pip3 install selenium) 安装成功后,可以通过( pip3 show selenium )命令查看安装的selenium版本信息 二、安装浏览…

【Pytest】结构介绍

1.目录结构介绍 project_root/ │ ├── tests/ # 测试用例存放目录 │ ├── __init__.py │ ├── test_module1.py │ ├── module1.py # 被测试的模块 ├── conftest.py # pytest配置文件,可定义fixture和钩子函数 ├── py…

Java - WebSocket

一、WebSocket 1.1、WebSocket概念 WebSocket是一种协议,用于在Web应用程序和服务器之间建立实时、双向的通信连接。它通过一个单一的TCP连接提供了持久化连接,这使得Web应用程序可以更加实时地传递数据。WebSocket协议最初由W3C开发,并于2…