Skip to content

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与事务**
  • ← 返回 **设计文档**

Knowledge4J — Java 知识库