2、数据库的索引与底层数据结构

常见的数据结构:二叉树、红黑树、Hash表、B-Tree

MySQL数据库作为一种结构化的数据库,存取操作的瓶颈在磁盘 I/O,因此,基于B-Tree改造的B+ Tree是最适合的数据结构。

为什么B Tree / B+ Tree"适合磁盘读取"?

核心设计思想

降低树高 = 减少磁盘 I/O 次数

为什么 B 系列树"矮"?

  • 一个节点可以存 很多 key

  • 一个节点大小通常 ≈ 一个磁盘页(16KB)

    一个节点:
    | k1 | k2 | k3 | ... | k500 |

B+ Tree 是什么

B+ Tree = B Tree 的"数据库特化版本"

核心结构特征

  1. 非叶子节点

    • 只存 key + 指针

    • ❌ 不存 data

  2. 叶子节点

    • 完整的 key + data

    • 叶子节点之间 用指针连成有序链表

示意:

复制代码
              [17 | 35]
             /           \
     [3 | 9 | 15] → [17 | 20 | 25] → [35 | 40 | 50]

B Tree vs B+ Tree 核心区别(表格)

对比点 B Tree B+ Tree
数据存储位置 所有节点 仅叶子节点
非叶子节点 key + data 仅 key
范围查询 中序遍历 叶子链表,极快
磁盘利用率 较低 更高
树高 较高 更低
顺序扫描 较慢 非常快

为什么 MySQL InnoDB 使用 B+ Tree?

1️⃣ 更低的树高(关键)

  • 非叶子节点不存 data

  • 一个页能放更多 key

👉 同样的数据量,B+ Tree 更矮

树高 ↓ 磁盘 I/O ↓ 性能 ↑


2️⃣ 范围查询是"数据库刚需"

SELECT * FROM orders WHERE create_time BETWEEN '2025-01-01' AND '2025-12-31';

  • B Tree:中序遍历,多次回溯

  • B+ Tree:找到起点 → 顺着叶子链表扫

👉 连续磁盘访问,极快


3️⃣ 更适合顺序扫描(ORDER BY / GROUP BY)

ORDER BY id;

B+ Tree 的叶子节点本身就是 有序链表

👉 不需要额外排序


4️⃣ 更稳定的查询性能

  • B Tree:命中位置不固定(可能在内部节点)

  • B+ Tree:所有查询最终都到叶子节点

👉 查询路径长度一致,性能稳定


5️⃣ 更符合缓存机制(Buffer Pool)

  • 非叶子节点体积小

  • 更容易常驻内存

👉 命中率更高

B+Tree的图形化描述

相关推荐
一 乐6 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
1.14(java)7 小时前
SQL数据库操作:从CRUD到高级查询
数据库
Full Stack Developme8 小时前
数据库索引的原理及类型和应用场景
数据库
乌萨奇也要立志学C++8 小时前
【洛谷】递归初阶 三道经典递归算法题(汉诺塔 / 占卜 DIY/FBI 树)详解
数据结构·c++·算法
鱼跃鹰飞9 小时前
Leetcode1891:割绳子
数据结构·算法
IDC02_FEIYA9 小时前
SQL Server 2025数据库安装图文教程(附SQL Server2025数据库下载安装包)
数据库·windows
辞砚技术录9 小时前
MySQL面试题——联合索引
数据库·面试
萧曵 丶10 小时前
MySQL 主键不推荐使用 UUID 的深层原因
数据库·mysql·索引
小北方城市网10 小时前
分布式锁实战指南:从选型到落地,避开 90% 的坑
java·数据库·redis·分布式·python·缓存
毕设十刻10 小时前
基于Vue的人事管理系统67zzz(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js