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为准,下一篇事务与再下一篇慢查询会接着用。