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 orders
WHERE user_id = 123
AND status = 'paid'
ORDER BY created_at DESC;

发现问题:Using filesort - 没有使用索引

解决方案#

创建复合索引#

CREATE INDEX idx_user_status_created
ON orders(user_id, status, created_at DESC);

优化后结果#

指标优化前优化后
查询时间3.5s8ms
rows_examined50000+15
WARNING

注意:索引并非越多越好,过多索引会影响写入性能。

总结#

  1. 遵循最左前缀原则
  2. 避免在索引列上使用函数
  3. 使用覆盖索引减少回表
  4. 定期分析表统计信息