数据库
MySQL慢查询定位实验:一条SQL从2s到200ms的优化
通过EXPLAIN命令分析查询执行计划,发现索引缺失导致全表扫描:
执行结果显示:
- type=ALL (全表扫描)
- key=null (未使用索引)
- rows=125832 (扫描行数)
优化步骤
优化效果
- 查询时间:从2000ms降至200ms
- 扫描行数:从125,832降至842
- CPU占用率:下降40%
索引优化建议
EXPLAIN SELECT user_id, COUNT(*) as count FROM experiment_reports
GROUP BY user_id ORDER BY count DESC;
- 添加复合索引:`ALTER TABLE experiment_reports ADD INDEX idx_user_type_time (user_id, report_type, create_time)`
- 优化GROUP BY语句:使用覆盖索引避免回表
- 分页优化:将`LIMIT 1000`改为基于游标分页
-- 优化后查询
EXPLAIN SELECT user_id, COUNT(*) as count FROM experiment_reports
USE INDEX (idx_user_type_time)
GROUP BY user_id ORDER BY count DESC;
- 为经常用于查询条件和排序的字段添加索引
- 使用EXPLAIN命令分析查询执行计划
- 避免在索引列上使用函数或计算
- 考虑复合索引的顺序:最左前缀原则
分享至: