02 - 索引与查询优化
定位:索引是 MySQL 性能的核心——理解 B+ 树、聚簇索引、优化策略,能覆盖 80% 的性能面试题 面试高频度:⭐⭐⭐⭐⭐
一、板块在体系中的位置
┌──────────────────────────────────────┐
│ 01-架构与存储引擎 (地基) │
│ InnoDB 内存/磁盘结构 │
└────────────────┬─────────────────────┘
↓
┌──────────────────────────────────────┐
│ 02-索引与查询优化 (本板块) │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌─────┐ │
│ │ B+树 │ │聚簇 │ │优化 │ │EXPL-│ │
│ │ │ │索引 │ │策略 │ │AIN │ │
│ └──────┘ └──────┘ └──────┘ └─────┘ │
└────────────────┬─────────────────────┘
↓
┌──────────────────────────────────────┐
│ 03-SQL与事务 │
│ MVCC / 隔离级别 │
└──────────────────────────────────────┘二、知识全景图
索引体系
├── 数据结构维度
│ ├── B+ 树索引(最核心)── 所有 InnoDB 索引都是 B+ 树
│ ├── 哈希索引 ── InnoDB 自适应哈希索引 (AHI)
│ └── 全文索引 ── 倒排索引(文本搜索)
├── 物理存储维度
│ ├── 聚簇索引(主键索引)── 数据即索引
│ └── 二级索引(辅助索引)── 叶子节点存主键值
├── 逻辑维度
│ ├── 单列索引
│ ├── 联合索引(复合索引)
│ ├── 唯一索引
│ └── 前缀索引
├── 优化策略
│ ├── 覆盖索引
│ ├── 索引下推 (ICP)
│ ├── 最左前缀原则
│ └── MRR (Multi-Range Read)
└── 查询分析工具
├── EXPLAIN
├── EXPLAIN ANALYZE (8.0.18+)
└── optimizer_trace三、子专题导航
| # | 主题 | 面试频率 | 核心内容 |
|---|---|---|---|
| **B+树索引结构** | B+树索引结构 | ⭐⭐⭐⭐⭐ | B+树 vs B树 vs 红黑树,MySQL 为什么选 B+树 |
| **聚簇索引与二级索引** | 聚簇索引与二级索引 | ⭐⭐⭐⭐⭐ | 索引组织表、回表、索引覆盖 |
| **索引优化策略** | 索引优化策略 | ⭐⭐⭐⭐⭐ | 联合索引、最左前缀、索引下推、MRR |
| **EXPLAIN与查询优化** | EXPLAIN 与查询优化 | ⭐⭐⭐⭐⭐ | 执行计划解读、慢查询优化方法论 |
四、核心考点速记
考点1:为什么 MySQL 用 B+ 树?
对比 B+树 B树 红黑树 哈希表
───────────── ────────── ───────── ───────── ─────────
磁盘 IO 次数 log₂N log₂N log₂N O(1)
范围查询 ✅ 高效 ❌ 中序 ❌ ❌
节点存储 ~100+ 键 ~2-3 键 1 键 1 键
叶子节点链表 ✅ 有 ❌ 无 ❌ ❌核心答案:B+树通过高扇出(每个节点存大量 key)降低树高(通常 3-4 层数据库能存千万级数据),且叶子节点链表让范围查询不需要回溯。
考点2:最左前缀原则
sql
-- 联合索引: (a, b, c)
-- 能用到索引的查询:
WHERE a = 1 -- ✅ 第一列
WHERE a = 1 AND b = 2 -- ✅ 前两列
WHERE a = 1 AND b = 2 AND c = 3 -- ✅ 全部
WHERE a = 1 ORDER BY b -- ✅ 排序也能用
-- 不能用到索引的查询:
WHERE b = 2 -- ❌ 跳过了第一列
WHERE c = 3 -- ❌ 跳过了前两列
WHERE b = 2 AND c = 3 -- ❌ 没有 a考点3:回表与覆盖索引
聚簇索引: 索引键(key) + 整行数据(data) ← 一次查询即可
二级索引: 索引键(key) + 主键值(primary key) ← 需要回表
覆盖索引: 查询需要的所有列都在二级索引中
不需要回表 ← 性能提升 1-2 个数量级📚 相关文件
- 上游板块:**架构与存储引擎**
- 下游板块:**SQL与事务**
- ← 返回 **设计文档**