当前位置: 首页 > news >正文

InnoDB 索引 B+Tree 全剖析

⭐ 第一章:为什么必须是 B+Tree 而不是 B-Tree / Hash?

1. Hash(均匀分布)

  • 优点:O(1) 查找
  • 缺点致命:不支持范围查询、排序、前缀匹配

WHERE age BETWEEN 10 AND 18 → 完全废掉

2. B-Tree(每个节点都保存数据)

  • 层级深
  • 每次查找会把节点全部读入内存
  • 叶子节点不联结 → 顺序扫描慢

3. B+Tree(InnoDB 采用)

✔ 所有数据都在叶子节点(固定大小页)
✔ 非叶节点只保存索引 key,让树更矮
✔ 叶子节点通过双向链表相连 → 范围查找超级高效
✔ 批量 IO、预读能力更强

一句话:B+Tree 更“磁盘友好”,这是数据库选它的根本理由。


⭐ 第二章:InnoDB 索引底层存储单位 —— Page(页)

理解任何索引问题,都必须从 Page 开始。
InnoDB 一页固定 16KB

一个节点 = 一个页
!(示意图)无法画图,用文字结构表达如下:

┌──────────────────────────┐
│ Page Header(记录数量等) │
├──────────────────────────┤
│ Directory Slots(记录目录)│
├──────────────────────────┤
│ 行记录1                   │
│ 行记录2                   │
│ ...                      │
└──────────────────────────┘

一个 B+Tree 节点就是一个 Page。
所以:

  • Page 越大 → 每个节点能容纳更多 key → 树越矮
  • 树越矮 → 查找越快(通常高度 2~4)

⭐ 第三章:聚簇索引(主键索引)结构

InnoDB 规定:

表数据本身就是一棵按主键排序的 B+Tree(聚簇索引)。

也就是:

主键索引的叶子节点上存放“整行记录”。

结构图:

                      [Root]/      \[Node]     [Node]/   \        /   \[Leaf: PK, row] [Leaf: PK, row] ...

叶子节点结构:

+-----------------------------+
| PK: 1 | name: Tom | age 20 |
+-----------------------------+
| PK: 2 | name: Bob | age 30 |
+-----------------------------+
...

数据按 PK 顺序紧密存放。


⭐ 第四章:二级索引(普通索引)结构

二级索引的叶子节点不存整行,而是:

叶子节点存储:索引列 + 主键值

结构如下:

Leaf page:
+------------------------+
| age: 20 | PK: 1        |
+------------------------+
| age: 20 | PK: 9        |
+------------------------+
| age: 30 | PK: 2        |
+------------------------+

想要获取整行怎么办?

必须“回表”:

  1. 在二级索引树找到 PK
  2. 到主键聚簇索引树里再查一遍

这就是回表的本质。


⭐ 第五章:一条查询在 B+Tree 中的真实路径

例如:

SELECT * FROM user WHERE age = 30;

步骤:

  1. 根据 age 进入二级索引 B+Tree
  2. 找到所有符合 age=30 的记录(叶子节点)
  3. 每条记录拿到主键值,例如 PK=2
  4. 回到聚簇索引 B+Tree
  5. 按 PK 找整行记录

流程图(文字版):

二级索引(B+Tree) ——找到PK→ 聚簇索引(B+Tree)

⭐ 第六章:为什么“回表”贵?

因为:

  • 二级索引查一次 = 若干次磁盘页 IO
  • 回表再查一次主键 = 再来若干次 IO

假设二级索引页高 = 3
主键页高 = 3

一次语句需要:
3+3 = 6次 page 访问(注意是最小情况)

如果 age=30 有 1000 行?
→ 就得回表 1000 次(糟糕)

所以覆盖索引非常重要。


⭐ 第七章:覆盖索引的威力

例如:

SELECT age FROM user WHERE age = 30;

如果只查二级索引里的字段(age 已经在二级索引里),不用回表。

称为 覆盖索引

效果:

  • 不回表 → 大幅减少 IO → 查询速度翻倍甚至几十倍
  • 执行计划显示:Using index

实际企业中会专门设计复合索引用来“覆盖重要查询”。


⭐ 第八章:复合索引是怎么存的?

例如:

CREATE INDEX idx_name_age ON user(name, age);

二级索引的 key 顺序是:

name → age → 主键

所以它的排序实际是:

(name1, age1, PK1)
(name1, age2, PK9)
(name2, age3, PK5)
...

这直接解释了:

  • 最左前缀原则
  • 为什么 name = ? AND age = ? 能走索引
  • 为什么 age = ? 不行

这是 B+Tree 排序规则决定的。


⭐ 第九章:页分裂与页合并

当你插入数据时:

  • 如果 16KB 页满了 → 分裂为两个页
  • 分裂后 B+Tree 层级可能会上升(树变高)

分裂代价:

  • IO 变多
  • 页不连续 → 碎片化 → 查询变慢
  • CPU 内存消耗增加

所以:

👉 使用自增主键顺序插入可以最大化避免页分裂
👉 UUID 主键特别容易造成页分裂,性能差

这就是为什么阿里规范极度推荐:

强制使用递增主键(bigint 自增)。


⭐ 第十章:为什么不要用 UUID 做主键?

简单一句:

UUID 是随机写,会疯狂触发页分裂。

效果:

  • Page 几乎每次都被打断成碎片
  • B+Tree 越长 → IO 越多
  • 写入性能降几十倍

真实场景你如果用了 UUID 当主键,一定会踩到“插入性能极差”。


⭐ 第十一章:一张图总结全部核心逻辑

(文字图示)

                二级索引树 (索引列 + PK)|| 回表v聚簇索引树 (整行记录)^|Page16KB

⭐ 最后:你现在掌握了哪些?

✔ 为什么是 B+Tree
✔ 聚簇索引 vs 二级索引
✔ 回表本质
✔ 覆盖索引
✔ 最左前缀原则
✔ Page 分裂
✔ 为什么自增主键最佳
✔ 为什么 UUID 糟糕
✔ 执行计划 cost 如何计算(基于 B+Tree 层级 + 回表 IO)

http://www.zskr.cn/news/74580.html

相关文章:

  • 2025 年 12 月电线厂家权威推荐榜:铜芯/无氧铜/BVR/光伏/工业/家装/消防电线全品类深度解析与选购指南
  • 2025年中国干式快速接头制造商推荐:航空专用干式快速接头哪
  • 2025 年 12 月折弯机折边机厂家权威推荐榜:自动/数控/大型/全自动/铜排/异形折边机,实力工厂精准选型与高效加工解决方案
  • 2025 年 12 月油漆品牌权威推荐榜:环保漆、工业漆、木器漆、墙面漆,源头厂家精选与性能深度解析
  • 2025年液化气专用干式快速接头厂商推荐:干式快速接头供应企
  • 2025年五大靠谱本国端口锁企业推荐,专业的usb端口锁与信
  • 2025 年 12 月旋转接头厂家权威推荐榜:高温/高压/高速/液压/蒸汽/导热油/水用多品类精密密封解决方案深度解析
  • 2025 年 12 月制氮机厂家权威推荐榜:PSA制氮机装置,模组制氮机,氨气净化干燥装置,高效节能与稳定供气深度解析
  • 2025年12月喷码机厂家权威推荐榜:全自动/小字符/高解析/油墨喷码机,智能赋码与高效生产解决方案精选
  • 2025年度合肥无人机培训课程TOP5推荐:安徽新东方教学模
  • 2025年12月料仓源头厂家实力推荐榜:专业定制、耐磨防堵与智能清仓技术领先企业深度解析
  • 2025 初中学习机品牌推荐:简单一百学习机,破解选机痛点,赋能初中进阶
  • python pyproject.toml 项目打包及分发
  • 2025年上海南京杭州快速电动阀供应商推荐:靠谱的电动阀服务
  • 2025 年立体车库厂家权威推荐榜:智能自动化/升降横移/垂直循环式立体车库,高效省地解决方案精选
  • TinyMCE:功能丰富且可定制的开源HTML编辑器 - 教程
  • 2025年度浙江实力强的复读学校TOP5权威推荐:看哪家口碑
  • 部分克隆 + 稀疏检出
  • 重练算法(代码随想录版) day32 - 动态规划part1
  • 2025 年 12 月二手压铸机厂家权威推荐榜:力劲/伊之密/锌合金/铝合金/热室/冷室压铸机买卖回收,精选耐用机型与高性价比之选
  • 2025玻璃钢拉挤型材源头厂家TOP5权威推荐:甄选高性价比
  • 2025年辽宁省口碑不错的工商注册公司推荐:服务不错的工商注
  • 量化图像“概念相似性”的新方法
  • DVWA 靶场全通关
  • Cisco Secure Firewall Threat Defense Virtual 7.7.11 - 思科下一代防火墙虚拟设备 (FTDv)
  • Cisco Firepower 4100 Series FTD Software 7.7.11 - 思科 Firepower 威胁防御系统软件
  • PbootCMS邮件配置修改发件人信息
  • 2025年12月刀模厂家权威推荐榜:雕刻刀模/蚀刻刀模/激光刀模/圆压圆刀模/夹治具/精密模具,匠心工艺与高效定制解决方案深度解析
  • 从资质、工艺到口碑严格筛选,2025年这份上海装修公司精选榜单请收好
  • PbootCMS模版制作:当天发布的文章显示红色的方法