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的图形化描述

相关推荐
鹿角片ljp1 分钟前
LeetCode 64:最小路径和复盘|二维 DP 与 ACM 模式完整写法
java·数据结构·算法
+VX:Fegn089542 分钟前
计算机毕业设计|基于springboot + vue蛋糕店管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·课程设计
彧azz1 小时前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
景熙55232 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
哈__2 小时前
KES-Operator重塑Kubernetes环境下的KES数据库集群管理
数据库·kubernetes·operator·kes
IvorySQL4 小时前
IvorySQL 5.6 发布:PG 18.6 内核升级,沙盒即开即用
数据库·人工智能·postgresql
CNSSIRD数据库5 小时前
中国企业环境信用数据库2003-2026
大数据·数据库·数据分析·论文笔记
fd32005 小时前
达梦数据库更新统计信息后仍走旧执行计划解决方案
数据库
华章酱6 小时前
MySQL幻读是怎么出现的
数据库·mysql·幻读
浅念-6 小时前
Redis基础详解:单线程模型、String与Hash数据结构
服务器·数据库·redis·sql·mysql·nosql数据库·nosql