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

相关推荐
全栈老石2 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_21 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐5 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
琢磨先生David5 天前
Day1:基础入门·两数之和(LeetCode 1)
数据结构·算法·leetcode