日期:2026-07-11
难度:中等
标签:#面试 #MySQL #优化器 #执行计划 #VIP
一句话答案
MySQL 优化器会在等价执行方式中,根据表与索引统计、选择性、连接顺序以及 CPU、IO 等成本估算候选计划,选择估算总代价较低的方案。
面试口语版
SQL 解析和语义检查后,优化器先做常量传播、条件下推、子查询和半连接改写等逻辑优化,再枚举可行访问路径,例如全表扫描、ref、range、不同索引、连接顺序和连接算法。它根据基数统计、索引基数、直方图、条件过滤率以及成本模型估算每个节点的行数、IO 和 CPU,选择估算成本较小的计划。因为统计可能过期、数据倾斜或条件相关,估算不一定准确,所以要用 EXPLAIN ANALYZE 对比 estimated rows 和 actual rows,再考虑 ANALYZE TABLE、直方图、改索引或最后才使用 hint。
原理拆解
flowchart LR
A[SQL 解析] --> B[逻辑改写]
B --> C[枚举访问路径]
C --> D[估算基数]
D --> E[计算 IO/CPU 成本]
E --> F[选择最低估算成本计划]
F --> G[EXPLAIN ANALYZE 校验]
关键细节
possible_keys是候选,key是最终选择;不走索引可能是成本判断而非“索引失效”。- 统计信息不是精确计数,数据倾斜和多列相关性会导致估算误差。
- hint 会固化人为判断,数据规模变化后可能变差,应谨慎作为最后手段。
面试官追问
- 为什么有索引却选择全表扫描?
- 直方图解决什么问题?
- estimated rows 与 actual rows 差距大怎么办?
高分补充
执行计划是基于当前统计和成本模型的预测,不是永远稳定的契约;重要 SQL 应做计划回归监控。
学习清单
- 熟悉基数、选择性、成本模型、统计信息和直方图。