Skip to content

MySQL InnoDB 与索引:B+ 树、聚簇索引与最左前缀

知识背景

InnoDB 是 MySQL 主流存储引擎,表数据按 聚簇索引(主键索引) 组织:叶子节点存整行数据(简化理解)。二级索引叶子存 主键值,回表再查聚簇索引。
索引的本质是用有序结构(典型 B+ 树)减少磁盘/内存读取次数;不懂索引,MP/手写 SQL 再漂亮也会慢。


知识详解与通俗解释

1. B+ 树(直觉版)

  • 多路平衡树,叶子节点串成链表,适合范围扫描与顺序读。
  • 非叶子节点只存键,叶子存数据或主键,树更矮,IO 次数更少

通俗说:像字典目录:先翻大部头章节,再翻到具体页,比从第一页线性翻快得多。

2. 聚簇索引 vs 二级索引

  • 主键就是聚簇索引;没有主键时 InnoDB 会选唯一非空索引或隐式行 ID。
  • 查询走二级索引时,一般要 回表(除非覆盖索引:索引列已含 SELECT 所需全部字段)。

3. 最左前缀与联合索引

联合索引 (a, b, c) 等价于先按 a、再 b、再 c 排序。条件里跳过最左列往往无法充分用索引(如只 where b=?)。
where a=? and c=? 可能只用上 a 一段,c 无法跳过 b 利用有序性(需结合具体执行计划)。

4. 常见误区

  • 索引不是越多越好:写入要维护索引,磁盘与缓冲池压力上升。
  • 函数/隐式类型转换可能导致索引失效(如对索引列做 substr、字符串列与数字比较)。

总结

  • InnoDB 主键即聚簇;二级索引多一步回表。
  • 联合索引设计要贴合真实查询条件的最左列与排序
  • 是否用上索引以 EXPLAIN 为准,下一篇事务与再下一篇慢查询会接着用。