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 与执行计划阅读,把索引结构落实为可验证的访问计划。