D
AI
学习工作台
8 周后端冲刺2026-05-221 分钟阅读

索引与查询路径

回表、覆盖索引、联合索引与最左前缀

8周冲刺week5MySQL索引记笔记标记疑惑

B+ 树索引

InnoDB 索引为 B+ 树:叶子链表便于范围扫描;非叶子只存键。高度通常 3~4 层可存千万行。

回表与覆盖

-- 二级索引 (name) ,SELECT id, name 覆盖;SELECT * 需回表
SELECT id, name FROM user WHERE name = 'alice';

设计 联合索引 时把常查列放一起实现覆盖:

CREATE INDEX idx_user ON orders(user_id, status, created_at);
SELECT user_id, status FROM orders WHERE user_id = 1 AND status = 2;

最左前缀与范围

(a,b,c)a=1 AND b>2 AND c=3 用到 a,b,c 可能无法继续精确(b 范围后 c 有序性断)。

索引列上函数导致失效:WHERE YEAR(create_time)=2024 → 改范围 create_time BETWEEN ...

索引选择

  • 高选择性列优先。
  • 区分度低(性别)单独索引价值低,可组合。
  • 前缀索引:长字符串 idx(col(20)),省空间但无法覆盖排序。

执行路径口述

  • Optimizer 选索引或全表扫。
  • 引擎层通过 B+ 树定位。
  • 回表读聚簇页(若需要)。
  • Server 层过滤、排序、聚合。
  • 排序:ORDER BY 列与索引一致可避免 filesort。GROUP BY 同理。

    Lab:/chapters/mysql-interview/index-path

    常见坑

    • 隐式类型转换:where varchar_col = 123 全表扫。
    • OR 跨列可能 union index merge 或放弃索引。
    • LIKE '%x' 无法用 B+ 树,'x%' 可用。

    与 EXPLAIN 衔接

    week05-explain-optimization 用 type/key/rows 验证索引是否命中。自检:为慢 SQL 设计三个联合索引并说明理由。

    实战巩固与面试表达

    本篇属于 8 周冲刺 week05-index-query-path 主题。复习时先闭卷回答 frontmatter 中三张 flashcard,再展开口述两个「为什么」:为什么这种方案能 work、边界失败时如何降级。与相邻章节对照:算法篇强调复杂度与模板,Go 篇强调工程默认写法,中间件篇强调线上故障案例。

    动手与自检清单

    用 25 分钟限时做 1 道相关练习题或画出一张架构/数据结构示意图;用 5 分钟写 STAR 片段说明你在项目里是否用过类似技术。记录 3 个面试追问及你的标准答法,存入 /zh/notebook/master-plan 笔记。若某点不熟,回到对应 /chapters 交互 Lab 重新走一遍流程,比死记卡片更有效。

    易错点提醒

    避免只背名词不会画图;避免只说优点不谈 trade-off(性能、一致性、运维成本至少提一项);避免把学习 Demo 说成百万 QPS 生产。回答时使用「场景 → 方案 → 结果 → 反思」四段式,体现工程成熟度。

    知识卡片

    问题

    什么是覆盖索引?

    点击翻转查看答案

    答案

    查询列全部在二级索引中即可得,Extra 显示 Using index,无需回表,减少随机 IO。

    问题

    联合索引 (a,b,c) 最左前缀规则?

    点击翻转查看答案

    答案

    可用 a;a,b;a,b,c 组合;单独 b 或 c 无法用该索引(除非 index merge 等例外)。

    问题

    索引下推 ICP 是什么?

    点击翻转查看答案

    答案

    MySQL 5.6+ 在存储引擎层用索引列过滤,减少回表行数;Extra: Using index condition。