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

EXPLAIN 与慢 SQL

type/key/rows/Extra 解读与优化闭环

8周冲刺week5MySQLEXPLAIN慢SQL记笔记标记疑惑

EXPLAIN 核心列

EXPLAIN SELECT * FROM orders WHERE user_id = 1 AND status = 2;

| 列 | 含义 | |----|------| | type | 访问类型 | | key | 实际使用索引 | | rows | 估算扫描行数 | | Extra | 附加信息 |

MySQL 8.0+ EXPLAIN ANALYZE 真实执行时间。

type 解读

  • const:主键/唯一等值一行。
  • ref:非唯一索引等值。
  • range:范围、IN、BETWEEN。
  • index:全索引扫描(比 ALL 好仍差)。
  • ALL:全表扫。

Extra 常见

  • Using index:覆盖索引,好。
  • Using where:Server 层过滤。
  • Using temporary:临时表,GROUP BY/DISTINCT 警惕。
  • Using index condition:ICP。

优化案例思路

  • 无索引WHERE create_time > ? → 加 (create_time) 或联合。
  • 回表多:SELECT 列纳入联合索引覆盖。
  • 深分页LIMIT 100000,10 慢 → 延迟关联或 WHERE id > last_id LIMIT 10
  • COUNT(*):二级索引 covering count 或冗余计数。
  • Lab:/chapters/mysql-interview/explain

    慢查询日志

    SET GLOBAL slow_query_log = ON;
    SET GLOBAL long_query_time = 1;

    pt-query-digest 聚合分析。关注 rows examined 与返回行比。

    改写技巧

    • 拆大 SQL;避免 SELECT *。
    • 批量化 INSERT;事务大小适中。
    • 统计信息过期:ANALYZE TABLE

    Week 5 闭环

    存储结构 → 索引路径 → MVCC → 锁 → EXPLAIN。面试画一条 UPDATE 全流程:加锁、undo、redo、binlog 两阶段提交(扩展)。

    实战巩固与面试表达

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

    动手与自检清单

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

    易错点提醒

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

    补充要点

    optimizer trace 看选索引原因;force index 仅调试用。统计信息不准导致错索引,定期 analyze。join 顺序小表驱动;子查询改 join 常更快。

    自检

    给一条慢 SQL 写 EXPLAIN 预期与三条优化方案。

    知识卡片

    问题

    EXPLAIN type 从好到坏大致顺序?

    点击翻转查看答案

    答案

    system > const > eq_ref > ref > range > index > ALL;至少 range,避免 ALL 大表全扫。

    问题

    Extra 中 Using filesort 含义?

    点击翻转查看答案

    答案

    无法利用索引顺序,额外排序(可能内存或磁盘);优化:调整索引匹配 ORDER BY 或减小结果集。

    问题

    慢 SQL 优化闭环步骤?

    点击翻转查看答案

    答案

    开启慢日志 → EXPLAIN/analyze → 索引/改写 SQL → 验证 rows 与耗时 → 上线观察。