1. MySQL索引的本质与演进
作为一名长期与MySQL打交道的开发者,我经常遇到这样的场景:当数据量达到百万级别时,原本飞快的查询突然变得异常缓慢。这时候,索引就是我们的救命稻草。但索引究竟是什么?为什么它能带来如此显著的性能提升?让我们从最基础的存储结构开始,逐步揭开索引的神秘面纱。
1.1 数据存储的基本单元:Page机制
MySQL与磁盘交互的最小单位是Page(页),默认大小为16KB。这个设计背后蕴含着深刻的工程智慧:
sql复制-- 创建一个简单的测试表
CREATE TABLE test_index (
id INT PRIMARY KEY,
name VARCHAR(20)
) ENGINE=InnoDB;
-- 插入示例数据
INSERT INTO test_index VALUES
(3, 'Charlie'),
(1, 'Alice'),
(4, 'David'),
(2, 'Bob');
有趣的是,当我们执行SELECT * FROM test_index时,会发现记录自动按照id排序输出。这不是巧合,而是InnoDB存储引擎的默认行为——它总是按照主键顺序存储数据。这种有序存储为后续的索引优化奠定了基础。
为什么选择16KB的Page大小?
这是经过大量实践验证的平衡点:
- 足够大:能存储多条记录(假设单条记录1KB,可存16条)
- 足够小:内存缓冲池(Buffer Pool)能缓存更多Page
- 机械磁盘的随机IO成本高,每次读取尽量多的数据更划算
1.2 从线性查找到目录优化
想象一下图书馆找书的场景。如果没有索引,我们只能从第一本书开始逐个查找——这就是线性扫描,时间复杂度O(n)。随着数据量增加,这种方式的效率急剧下降。
MySQL的解决方案是引入"目录"概念。在单个Page内部,通过目录将数据分成多个槽(slot),每个槽指向一组有序记录。查找时先定位槽,再在槽内查找,将O(n)的复杂度降为O(logn)。
sql复制-- 查看表的Page信息(需要权限)
SHOW TABLE STATUS LIKE 'test_index';
当数据量超过单个Page容量时,MySQL会自动分配新的Page。这些Page通过双向链表连接,形成了最初的"全表扫描"模式。此时查找需要遍历所有Page,效率仍然不理想。
1.3 B+树:索引的终极形态
为解决多Page查询效率问题,MySQL引入了B+树结构。这是一种多路平衡查找树,具有以下关键特性:
- 多层级目录:顶层是根节点,中间是目录节点,底层是叶子节点
- 高扇出:每个节点可以包含大量子节点指针(通常超过100)
- 有序叶子:所有叶子节点通过指针相连,形成有序链表

B+树的查找过程就像查字典:先从目录找到大致范围,再翻到具体页。对于1亿条记录,B+树只需3-4次IO就能定位数据,而线性扫描平均需要5千万次!
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. B+树的深度解析
2.1 为什么是B+树而不是其他数据结构
在选择索引结构时,MySQL团队评估了多种方案:
| 数据结构 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 哈希表 | O(1)查找 | 无法范围查询,内存消耗大 | 等值查询缓存 |
| 二叉搜索树 | 逻 |
