MySQL索引原理:B+树与聚簇索引

好题目,这个是 MySQL 性能优化的核心基础 👍
我用 “原理 → 结构 → 工作方式 → 对比 → 常见面试点” 的顺序,帮你把 B+ 树 和 聚簇索引 一次讲透。


一、为什么 MySQL 需要索引?

👉 本质一句话:
减少磁盘 I/O,把随机查找变成有序查找

没有索引:

  • 全表扫描(一行一行读)
  • 数据量大 → 慢到爆炸

有索引:

  • 像查字典一样,直接定位

InnoDB 存储引擎默认使用:

B+ 树索引


二、B+ 树是什么?

1️⃣ B+ 树的基本结构

B+ 树是 多路平衡搜索树,特点:

  • 所有数据 只存储在叶子节点
  • 非叶子节点 只存索引(key)
  • 叶子节点之间通过 双向链表 连接
  • 树高度低(通常 2~4 层)

简化示意:

          [10 | 20 | 30]
        /      |        \
   [1,5,8]  [10,15]  [20,25,30]
      ↓         ↓          ↓
    数据      数据       数据

2️⃣ 为什么不用二叉树 / 红黑树?

结构问题
二叉树容易退化成链表
红黑树树高太高,磁盘 IO 次数多
Hash不支持范围查询

✅ B+ 树优势

  • 分支多 → 树矮 → I/O 次数少
  • 叶子节点有序 → 范围查询极快

三、B+ 树与磁盘 I/O 的关系(重点)

  • MySQL 数据存储在 磁盘
  • 一次 I/O 读取的是 一整页(16KB)
  • 非叶子节点只存 key → 一个页能存 成百上千个指针

👉 一次 I/O = 一层树

例如:

  • 3 层 B+ 树 ≈ 3 次磁盘 I/O
  • 能索引上千万数据

四、什么是聚簇索引(Clustered Index)

1️⃣ 定义

聚簇索引:索引和数据“长在一起”

在 InnoDB 中:

  • 表的数据本身就是按主键顺序组织的一棵 B+ 树
  • 这棵树就是 聚簇索引

📌 一张表只能有一个聚簇索引


2️⃣ 聚簇索引的规则

InnoDB 聚簇索引选择顺序:

  1. PRIMARY KEY
  2. 第一个 NOT NULL + UNIQUE 索引
  3. 隐式生成 row_id

3️⃣ 聚簇索引结构示意

聚簇索引 B+ 树(主键)
┌─────────────┐
│   key=10    │
│   整行数据  │
└─────────────┘

👉 叶子节点直接存整行数据


五、二级索引(非聚簇索引)

1️⃣ 二级索引结构

  • 也是 B+ 树
  • 叶子节点存:
    • 索引字段值
    • 主键值
二级索引 B+ 树
┌─────────────┐
│ name=Tom    │
│ PK=10       │
└─────────────┘

2️⃣ 回表查询(重点)

查询流程:

SELECT * FROM user WHERE name = 'Tom';

步骤:

  1. 在 name 二级索引 找到主键值 10
  2. 拿主键 10 回到 聚簇索引
  3. 查整行数据

👉 这一步叫:回表


六、覆盖索引(性能优化利器)

如果查询字段 都在二级索引中

SELECT name FROM user WHERE name = 'Tom';
  • 不需要回表
  • 直接返回结果

✅ 称为:覆盖索引


七、聚簇索引 vs 非聚簇索引总结

对比项聚簇索引二级索引
叶子节点整行数据主键
索引数量只能一个可多个
查询主键慢(需回表)
更新代价较大较小

八、为什么主键要“自增”?

不推荐:

UUID、随机字符串

问题:

  • 页分裂
  • 数据移动
  • 碎片严重

推荐:

BIGINT AUTO_INCREMENT

优势:

  • 顺序写入
  • 减少页分裂
  • 性能稳定

九、面试高频一句话总结(背这个)

InnoDB 使用 B+ 树作为索引结构,数据按主键顺序存储在聚簇索引中。二级索引叶子节点存主键值,查询时需要回表,覆盖索引可避免回表。


如果你愿意,我还能继续给你讲:

  • 🔥 索引失效的 10 种场景
  • 🔥 最左前缀原则
  • 🔥 联合索引设计套路
  • 🔥 Explain 执行计划解读
  • 🔥 面试 MySQL 索引追问全套

你是 准备面试,还是 线上数据库性能优化

文章已创建 4298

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部