数据库 · 主观题 · 第 48 题
计算机基础面试八股 · 第 48 题
线上出现慢 SQL,你会如何排查和优化?
参考答案
1. 发现:开启慢查询日志(long_query_time),用 pt-query-digest 等工具汇总,或者看 APM 和数据库监控。
2. 分析:EXPLAIN 看 type、key、rows、Extra(Using filesort、Using temporary、Using index);必要时用 EXPLAIN ANALYZE 或 optimizer_trace 看实际执行情况。
3. 索引优化:给过滤、排序、关联列建合适的联合索引,遵守最左前缀;尽量做成覆盖索引减少回表;避免在索引列上用函数、隐式类型转换、前导 % 的模糊匹配。
4. SQL 改写:只查需要的列,不写 SELECT *;深分页改用「上一页最后的 id」做条件或延迟关联;大 IN 拆批;复杂子查询改成 JOIN。
5. 结构与架构:冷热分离、归档历史数据,读写分离,热点数据加缓存,数据量很大时分库分表。
6. 排查锁等待:SHOW ENGINE INNODB STATUS 以及 performance_schema 里的锁信息,把长事务拆小。
解析
按「发现 → 分析 → 索引 → 改写 → 架构」的顺序作答更有条理。