Yihui’s Blog

MySQL 中如何进行 SQL 调优?

日期: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 索引。
  • 更新统计信息、检查索引基数;必要时用直方图辅助优化器。

面试官追问

  1. 联合索引字段顺序怎么定?
  2. 为什么函数会导致索引失效?
  3. 如何优化千万级深分页?

学习清单

  • 每次优化保留优化前后 SQL、EXPLAIN、耗时与扫描行数。
Maintained by · YihuiEdit on GitHub

Keep reading

View all posts