210 words
1 minute
MySQL 索引优化实战
线上查询从 3s 优化到 10ms,我是这样做的
背景
某天收到业务方反馈,订单列表接口响应很慢,查询一次需要 3-5 秒。
问题排查
1. 开启慢查询日志
-- 查看慢查询配置SHOW VARIABLES LIKE 'slow_query_log%';
-- 设置慢查询阈值SET GLOBAL long_query_time = 1;2. 分析 EXPLAIN
EXPLAIN SELECT * FROM ordersWHERE user_id = 123AND status = 'paid'ORDER BY created_at DESC;发现问题:Using filesort - 没有使用索引
解决方案
创建复合索引
CREATE INDEX idx_user_status_createdON orders(user_id, status, created_at DESC);优化后结果
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 查询时间 | 3.5s | 8ms |
| rows_examined | 50000+ | 15 |
WARNING注意:索引并非越多越好,过多索引会影响写入性能。
总结
- 遵循最左前缀原则
- 避免在索引列上使用函数
- 使用覆盖索引减少回表
- 定期分析表统计信息