很多人在学习 MySQL 索引时,都会经历一个非常痛苦的阶段:
刚开始学的时候:
- 什么是索引?
- 为什么会出现 B树、B+树?
- 主键又是什么?
- 聚簇索引、普通索引、回表又是什么?
感觉所有概念突然一起冲了出来。
最后的结果通常是:
每个词好像都听过,但整体完全串不起来。
而我最近在学习 MySQL 索引时,也正好经历了这个阶段。
后来我发现:
其实并不是索引难,而是大部分资料一开始就直接讲 B+树,导致新人根本不知道这些东西之间到底是什么关系。
所以这一篇文章,我不打算上来就讲八股。
而是从“数据库为什么需要索引”开始,一步步把:
索引 ↓ B树 ↓ B+树 ↓ 主键这些概念真正串起来。
一、数据库最原始的问题:查数据太慢
假设现在有一张用户表:
user id name age 1 Tom 20 2 Jack 22 3 Lucy 19现在执行一条 SQL:
SELECT * FROM user WHERE id = 2;如果数据库没有任何“加速结构”,它会怎么做?
答案是:
一行一行找。
也就是:
id=1 ❌ id=2 ✔ id=3 ❌这种方式叫:
全表扫描(Full Table Scan)
数据少的时候问题不大。
但如果是:
100万条 1000万条 甚至上亿条数据那就会非常慢。
二、于是数据库需要“目录”
这个时候,人类会很自然想到一个东西:
目录。
就像一本书:
- 没目录 → 一页页翻
- 有目录 → 直接定位章节
数据库也是一样。
于是:索引(Index)出现了
三、索引到底是什么?
一句话理解:
索引 = 数据库提前整理好的一份“查找目录”
比如:
id 数据位置 1 第100行 2 第200行 3 第300行数据库先查“目录”,再定位真正的数据。
所以:
索引的本质:
用空间换时间。
四、那索引怎么存储才最快?
这里就开始引出:
树结构
因为:
如果数据量很大:
1 2 3 4 5 ... 10000000普通数组查找、插入、排序都会有问题。
于是数据库需要一种:
查询快 插入快 删除快 还能保持有序的数据结构。
于是:B树 和 B+树出现了
五、B树(B-Tree)是什么?
B树的核心思想是:
每个节点都可以存数据。
结构类似:
[30] / \ [10] [50] / \ / \ [5] [20] [40] [60]这里:
- 30 是数据
- 10 / 50 也是数据
- 5 / 20 / 40 / 60 也是数据
也就是说:数据分散在树的各层。
B树的特点
1、每层都可能有数据
查找时:
可能中途就找到。
2、查询路径不固定
有时候查2层:
有时候查3层。
3、范围查询不方便
因为数据是分散的。
六、B+树是什么?
后来数据库发现:
B树虽然已经很强了,但仍然不够适合数据库。
于是出现了:
B+树(B+ Tree)
B+树最核心的变化:所有数据只放在叶子节点。
上层节点:
只负责导航。
结构类似:
[30] / \ [10|20] [30|50] 叶子节点: 10 → 20 → 30 → 40 → 50 → 60七、B+树最重要的三个特点
1、非叶子节点不存真实数据
它们只是:
目录 导航 路标2、所有数据都在叶子节点
这样结构非常统一。
3、叶子节点之间形成链表
这是 B+树最关键的一点。
比如:
10 → 20 → 30 → 40 → 50这样数据库做范围查询时:
SELECT * FROM user WHERE id BETWEEN 20 AND 50;就会非常快。
八、B树 vs B+树(终于能看懂了)
| 对比 | B树 | B+树 |
|---|---|---|
| 数据位置 | 各层都有 | 只在叶子 |
| 非叶子节点 | 存数据 | 只存索引 |
| 查询路径 | 不固定 | 固定 |
| 范围查询 | 一般 | 非常强 |
| 叶子节点 | 无链表 | 链表结构 |
| 数据库使用 | 少 | 主流 |
九、主键又是什么?
讲到这里,很多人又会开始懵:
主键怎么又出来了?
其实主键很简单。
一句话:
主键 = 每行数据的唯一身份证
比如:
id = 1001这个 id:
不会重复。
数据库会使用:
主键 + B+树
来组织整个数据结构。
于是:
主键索引出现了。
十、终于把关系串起来了
到这里,我们终于可以把整个链路串起来:
数据太多 ↓ 全表扫描太慢 ↓ 需要索引(目录) ↓ 索引需要高效结构 ↓ 出现 B树 / B+树 ↓ 数据库最终选择 B+树 ↓ 主键作为唯一标识 ↓ MySQL 用 B+树组织主键十一、这一篇你真正需要记住什么?
其实只需要记住下面三句话:
1、索引是“目录”
作用:
加速数据查找。
2、B+树是“索引的实现结构”
它不是业务概念。
而是:
数据结构。
3、主键是“唯一标识”
数据库使用:
主键 + B+树来组织数据。
十二、结尾
很多时候:
我们不是学不会数据库索引。
而是:
一开始就被各种概念同时轰炸。
其实真正的学习顺序应该是:
为什么需要索引 ↓ 索引是什么 ↓ B+树是什么 ↓ 主键索引 ↓ 普通索引 ↓ 回表 ↓ 联合索引只有这样,整个知识体系才会真正连起来。
下一篇预告
下一篇,我们正式进入:
《MySQL 索引原理系列(二):终于搞懂 B树 和 B+树》
会真正讲清:
- 为什么树结构会出现
- 为什么数据库不用红黑树
- 为什么 MySQL 最终选择 B+树
- B+树为什么特别适合磁盘 IO
这一篇开始,我们正式进入:
MySQL 索引底层原理。