华为云 RDS for MySQL 实践:慢查询定位与索引优化
一、背景:慢查询为什么必须治理
在业务系统上线初期,几条核心 SQL 跑在几千行的小表上,响应永远是毫秒级。随着数据量涨到百万、千万级,同样的 SQL 可能从 2ms 退化到 20s,拖垮连接池,甚至引发整库雪崩。慢查询治理不是一次性的优化动作,而应该成为数据库运维的常规动作。华为云 RDS for MySQL 提供了慢日志、性能洞察、在线 DDL 等完整工具链,本文基于一个订单查询场景,梳理"定位 → 分析 → 优化 → 验证"的完整流程。
二、开启并使用慢查询日志
第一步是让慢 SQL 现形。在 RDS 控制台参数组中,确认以下参数:
slow_query_log = ON long_query_time = 1 log_queries_not_using_indexes = OFF
long_query_time 设为 1 秒是生产环境的常用起点:既能过滤掉大量正常查询,又不会漏掉真正影响业务的 SQL。开启后,控制台「慢日志分析」页面会按天聚合慢查询,并按 SQL 指纹(Fingerprint)归并,可以直接看到执行次数、平均耗时、扫描行数、返回行数四个关键指标。治理优先级通常是:执行次数 × 平均耗时 最大的前几条。
一个典型的场景是订单列表页的查询:
SELECT o.order_id, o.user_id, o.status, o.created_at FROM orders o WHERE o.created_at >= '2026-11-01' AND o.status = 'PAID' ORDER BY o.created_at DESC LIMIT 20;
当 orders 表只有 created_at 的单列索引时,这条 SQL 需要回表取 status 再过滤,扫描行数远高于返回行数。
三、用 EXPLAIN 读懂执行计划
对慢 SQL 执行 EXPLAIN,重点关注三个字段:
1. type(访问类型):从好到差大致是 const > eq_ref > ref > range > index > ALL。出现 ALL 就是全表扫描,是优化第一目标;range 及以上通常可以接受。
2. key 与 rows:key 表示实际使用的索引,rows 是预估扫描行数。如果 key 为 NULL,说明没有走索引。
3. Extra:出现 Using filesort 表示额外排序,Using temporary 表示使用了临时表,Using index 则是有利信号——说明命中了覆盖索引,无需回表。
优化前该 SQL 的 EXPLAIN 结果是 type=range(走 created_at 索引)、Extra 出现 Using where + Using filesort,rows 约 80 万;优化目标就是消除回表过滤和 filesort。
四、索引优化的三个抓手
1. 组合索引的列顺序:等值条件列在前、范围条件列在后、排序列紧随其后。上面的 SQL 可以建组合索引 (status, created_at):status 等值命中后,created_at 天然是有序的,范围过滤和 ORDER BY 都直接走索引,filesort 消失。
2. 覆盖索引:如果查询列都能从索引中拿到,就无需回表。高频小字段(如 status、amount)可以放进索引,让 Using index 出现在 Extra 中。但索引不是越多越好,每个二级索引都会增加写入开销和存储占用。
3. 最左前缀原则:组合索引 (a, b, c) 只对 a、(a,b)、(a,b,c) 前缀生效,查询条件里缺了 a,后面的列就用不上。这是评审索引需求时最常踩的坑。
五、华为云 RDS 的配套能力
改索引不是裸改。RDS for MySQL 提供了几层保障:其一,支持 Online DDL,大表加索引期间不锁写(部分场景使用 Instant/Inplace 算法),可以在业务低峰期执行;其二,自动备份 + 按时间点恢复(PITR),万一 DDL 出问题可以回退;其三,性能洞察页面可以在加索引前后对比 CPU、IOPS、QPS 曲线,用数据验证优化效果;其四,读写分离可以把报表类慢查询切到只读实例,避免冲击主库。
六、验证与收尾
优化后再次 EXPLAIN:type=ref,key 命中 idx_status_created,rows 降到百级,Extra 只剩 Using index condition。业务侧 P99 响应从 3.2s 降到 40ms 左右。最后把这条 SQL 的指纹加入慢日志持续观察一周,确认没有回退,并顺手把 long_query_time 告警接入通知,形成闭环。
总结:慢查询治理 = 慢日志定位 + EXPLAIN 分析 + 组合索引/覆盖索引改造 + 数据化验证。工具链华为云 RDS 都内置了,剩下的就是把它变成团队每周例行的动作。
- 点赞
- 收藏
- 关注作者
评论(0)