跳到正文
Elaine Blog
返回

InnoDB 页、行与 B+Tree 索引

MyBatis、MySQL 与数据架构

InnoDB 按“页”管理磁盘和缓存中的数据,索引负责缩小需要访问的页和记录范围。主键不仅保证唯一,还决定表数据的组织方式,并被每个二级索引引用。

Table of contents

Open Table of contents

页、行、索引分别是什么

页是 InnoDB 读写和缓存的基本数据单位。行是业务记录。B+Tree 是多路平衡搜索树:中间节点存范围导航,叶子节点按键有序连接,所以既适合等值查找,也适合连续范围扫描。

“树高”不是索引是否快的唯一因素。真实成本还包括命中的页数、随机或顺序访问、回表次数和返回行数。

聚簇索引与二级索引

聚簇索引的叶子保存完整行。InnoDB 通常使用主键作为聚簇索引;二级索引叶子保存“二级键 + 主键”。

idx_orders_status_created 叶子:(status, created_at, id)

                                    └─ 用 id 再查 PRIMARY 叶子的完整行

第二次查主键的过程叫“回表”。如果查询所需列都已在二级索引中,就形成覆盖索引,可以避免回表。但把所有列都塞进索引会增加空间、写放大和缓存压力。

主键为何宜短、稳定、递增友好

宽主键会复制进所有二级索引;频繁更新主键等同于移动记录;完全随机的键可能让插入落到分散页,引起页分裂和缓存局部性下降。业务上仍要先保证全局唯一与生成可靠,再权衡写入局部性,不能为了“连续”牺牲正确性。

用查询判断是否回表

EXPLAIN ANALYZE
SELECT id, created_at, amount
FROM orders
WHERE user_id = 1
ORDER BY created_at, id
LIMIT 20;

实验索引 (user_id, created_at, id)包含前三列,但不含 amount,因此拿金额通常还需访问聚簇索引。去掉 amount 再比较计划和实际耗时。小数据差异可能不明显,应扩充数据并多次测量。

参考 InnoDB 聚簇与二级索引

下一步

继续阅读06-06 Explain 与执行计划阅读,把索引结构落实为可验证的访问计划。


分享这篇文章:

上一篇
MySQL 架构与 SQL 生命周期
下一篇
Explain 与执行计划阅读