日期:2026-07-11
难度:中等
标签:#面试 #MySQL #SQL优化 #索引
一句话答案
SQL 调优应以真实慢 SQL 和执行计划为证据,先缩小扫描数据、让条件和排序命中合适索引,再改写 SQL 与表结构,并通过压测和监控验证收益与写入代价。
面试口语版
我的流程是“发现—定位—优化—验证”。先从慢查询日志、监控和业务链路确认频率、P95/P99、扫描行数和数据量;用 EXPLAIN/EXPLAIN ANALYZE 判断是否全表扫、回表过多、排序临时表、Join 顺序或估算失真。然后按查询模式设计联合索引,让等值条件在前、范围和排序按实际场景放置,尽量覆盖查询;同时避免 SELECT *、索引列函数或隐式类型转换、深分页和不必要的 Join。改动后在接近生产的数据分布下回归,并评估新增索引对写入、空间和 DDL 的影响。
关键细节
- 优先保证 WHERE/JOIN/ORDER BY 的可索引性(SARGable),例如改
DATE(created_at)=?为时间范围。 - 分页优先基于索引的 seek/cursor,而不是很大的
LIMIT offset。 OR、低选择性列、前导模糊匹配不一定适合普通 B+Tree 索引。- 更新统计信息、检查索引基数;必要时用直方图辅助优化器。
面试官追问
- 联合索引字段顺序怎么定?
- 为什么函数会导致索引失效?
- 如何优化千万级深分页?
学习清单
- 每次优化保留优化前后 SQL、EXPLAIN、耗时与扫描行数。