真正“看到”MySQL 查找索引时在做什么?一次查找过程全解析!
很多人听说过“索引提升查询效率”,也知道“B+树查找只需要几次”,但MySQL 在查找一条带索引的记录时到底做了什么?为什么这么快?*今天我们就带你一步一步*看清楚这个过程!
💡 背景场景
我们有一张百万级数据表 users,字段如下:
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100),
...
);
我们创建了如下索引:
CREATE INDEX idx_email ON users(email);
现在,我们执行一条查询:
SELECT * FROM users WHERE email = 'test@example.com';
❓ 如果没有索引会怎样?
没有索引,MySQL 只能一行一行扫描所有记录,判断哪一行的 email 等于你要的值,这就是全表扫描(Full Table Scan)。
- 数据量小还可以忍
- 数据量一大,速度将指数级下降!
✅ 有了索引,MySQL 做了什么?
这就像 MySQL 拿出一本“智能字典”来帮你跳着找,下面是整个查找过程的真实步骤:
✅ 第 1 步:MySQL 找到对应的索引(B+ 树)
当你执行 SQL 时,MySQL 知道你给 email 建立了索引,于是会使用一个叫 B+树 的结构来查找。
可以想象为一棵目录结构清晰的“导航树”:
[M]
/ \
[G] [T]
/ \ / \
[A-F] [H-K] [P-R] [U-Z]
每个节点都是“导航页”,告诉你数据在哪一段。
✅ 第 2 步:从根节点开始,逐层跳跃
你查的是 test@example.com,那么:
- 第 1 层:发现 "T" 比 "M" 大,跳到右边
[T]节点 - 第 2 层:在
[T]节点中继续查找 email 所在范围,比如在[P-R]中 - 第 3 层(叶子节点):最终找到排序后的 email 列表
比如:
tan@example.com → 数据地址A
taylor@example.com → 数据地址B
test@example.com → ✅ 找到了,地址C
✅ 第 3 步:拿到“数据地址”,读取完整行数据
索引叶子节点记录了每个 email 对应的主键或记录地址。
- MySQL 拿到地址 C,跳过去读取完整的
users表记录 - 你得到完整的
id, name, email...信息
✨ 为什么只需查几次?
因为 B+树的结构是“多叉高扇出+有序跳跃”,即使是百万级数据,也通常只有 3~5 层,只需查几次就搞定!
它的时间复杂度是 O(log n),而不是 O(n)。
🔁 对比没有索引 vs 有索引:
| 比较项 | 无索引(全表扫描) | 有索引(B+树) |
|---|---|---|
| 查找方式 | 一行一行比对 | 跳跃式查找节点 |
| 数据量 10W 条 | 最多查 10W 次 | 查 3~5 次即可 |
| 查找效率 | 极慢 | 非常快 |
📘 类比记忆法
📖 没有索引:
像查字典没有目录,从第一页翻到最后一页,一页页地找词。
📚 有了索引(B+树):
就像查有拼音索引的词典,你直接跳到“T”字开头,再跳到“test”,一下就找到了!
📌 小结:MySQL查找一条索引记录的完整过程
- 确认使用了哪个索引字段(如:email)
- 从 B+ 树的根节点开始,按规则跳跃查找
- 到叶子节点找到目标值对应的“主键或地址”
- 再通过地址读取完整数据
所以:
真正让查询变快的,不是SQL写得多短,而是你有没有“帮MySQL准备好快速通道”——也就是索引!
浙公网安备 33010602011771号