标准答案
- 重点查看访问类型、key 或索引选择、rows 估算、filtered 过滤比例,以及 Extra 中的临时表、排序和覆盖索引提示。
- 全表扫描不必然错误;小表、低选择性条件或需要返回大部分行时,扫描可能比随机索引访问更便宜。
- 二级索引命中后仍读取非索引列时可能回表,覆盖索引提示意味着可以直接从索引返回。
- 出现临时表或排序要判断结果集规模和频率,不能看到关键词就盲目加索引。
- 估算值与实际值差异很大时,应怀疑统计信息、参数分布、隐式转换或数据倾斜。
题目解析
执行计划是优化器对成本的预测,不是性能结论。真正要对比的是计划估算、慢日志的耗时、实际返回行数、锁等待和系统资源,避免为了让 EXPLAIN 看起来漂亮而牺牲写入性能。
优化应该从最重的节点开始。一个 JOIN 前扫描百万行、过滤后只剩十行,比最终排序十行更值得优先处理;反之,列表页大 OFFSET 导致的扫描可能比某个函数条件影响更大。
代码示例
执行计划应与具体 SQL、参数和数据量一起保存,下面只展示检查入口。
sql
EXPLAIN ANALYZE
SELECT id, created_at
FROM orders
WHERE tenant_id = 42 AND status = 'paid'
ORDER BY created_at DESC
LIMIT 20;常见误区
- 只看 type 是否为 ref,而不看 rows、实际耗时和结果集规模。
- 在线上直接对高风险写入 SQL 做分析或试验,忽略锁和资源影响。