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) 或联合。LIMIT 100000,10 慢 → 延迟关联或 WHERE id > last_id LIMIT 10。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 预期与三条优化方案。