大促后慢SQL集中治理与归档的核心答案是:按“影响面-频率-趋势”三维分级,先处理高频高风险SQL,再用自动化归档机制沉淀优化经验,避免下轮大促重蹈覆辙。
为什么大促后慢SQL会集中爆发
大促期间系统扛住了流量,但活动一结束,各种慢查询就像退潮后的礁石露出来,这里面有共性原因。
缓存集中失效是最常见的导火索,大促前缓存里塞满了热点数据,活动结束后这些key的过期时间集中到达,大量请求穿透到数据库,比如商品详情页、库存查询这类接口,一旦缓存雪崩,数据库瞬间要承接好几倍的查询压力,业务方往往只关注大促当天的表现,忽略了事后缓存重建的强度。
数据倾斜被放大了,大促期间产生的订单、日志数据量猛增,分表分库的键位如果设计不合理,某些分片的数据量可能是其他分片的几十倍,平时数据量小感觉不到,大促后查询这些“胖子分片”,全表扫描的代价就格外刺眼,业内专家指出,大促后一周内慢SQL的数量通常比平时多出三到五倍,这个数字并不夸张。
临时任务和报表查询扎堆,运营要复盘数据,财务要对账,技术要出活动报告,各种临时联表查询、大范围聚合查询全在这几天跑,这些任务往往没有走专业的数据分析平台,直接怼到生产库上,和线上业务抢资源,很多慢SQL不是业务代码写的,而是临时工凭着感觉拼出来的。
慢SQL治理优先级怎么排
面对几十上百条慢SQL,不能眉毛胡子一把抓,排序的核心原则是:先看QPS和影响行数,再看执行计划里有没有全表扫描。
按影响面分级
P0级:影响核心交易链路,比如订单查询卡顿导致支付超时,这类SQL必须当天处理,手段包括紧急加索引、改写查询条件、引入本地缓存。
P1级:影响非核心但有感知的功能,比如用户中心的历史订单翻页、优惠券列表,这类SQL可以放在两三天内优化,优先调整索引和SQL结构。

P2级:只影响内部运营和后台导出,比如管理端的销售统计报表,这类SQL不必赶时间,但需要纳入归档清单,避免下轮大促重现。
按执行频率分级
执行频率比单次耗时更能决定系统健康度,一条耗时2秒但一天只跑20次的SQL,和一条耗时500毫秒但每秒跑20次的SQL,后者危害大得多,优化时会话层临时开启慢查询日志,按“平均耗时×执行次数”计算综合得分,从高到低排列。
实际操作中,可以执行下面的查询来找出高频慢SQL:
SELECT digest_text, count() AS exec_count, avg_query_time FROM performance_schema.events_statements_summary_by_digest WHERE schema_name = '你的业务库' AND last_seen > DATE_SUB(NOW(), INTERVAL 7 DAY) GROUP BY digest_text ORDER BY exec_count DESC LIMIT 50;
这个查询直接从performance_schema取数,不需要额外装工具,重点看那些exec_count特别高且avg_query_time超标的语句。
慢SQL归档方案怎么做
归档不是简单存个文件,而是把“问题SQL、优化动作、效果验证、后续监控”打包成可复用的知识库,归档的最终目的是让下一次大促不再踩同一个坑。
分三档归档策略
第一档:已优化SQL,记录优化前后的执行计划对比,修改了哪些索引、改写了什么逻辑,这些内容直接进团队的代码仓库,作为后续开发规范的一部分。
第二档:待观察SQL,有些SQL虽然慢但原因是外部依赖,比如ES响应慢、另一张表锁竞争,这类SQL归档时标注关联方,建立联调机制。
第三档:废弃SQL,大促后很多临时表、冗余字段不再使用,对应的查询也要一并清理,归档这些SQL的意义在于提醒后续运维人员:这些表结构可以下线了。
归档工具和操作路径
最朴实的方法是用mysqldump加上定时任务,把慢查询日志表按周导出为CSV,然后存进对象存储,但更推荐直接使用数据库自带的审计能力:
- MySQL 8.0用
performance_schema的,这个表按SQL摘要聚合,不会因为参数不同而泛滥。
events_statements_summary_by_digest
- 开启
log_slow_admin_statements参数,把ALTER TABLE等管理语句也记入慢日志。 - 通过
pt-query-digest工具把慢日志转换成报告,这条命令值得记住:
pt-query-digest /var/log/mysql/slow.log > /data/archive/report_$(date +%F).txt
生成的报告会自动排序,把最耗时的查询排前面,还带执行计划建议。
的标准化模板
每条归档记录建议包含六个字段,缺一不可:
- 发现日期和现场环境(版本、硬件配置)
- 原始SQL和涉及的表结构
- 耗时、扫描行数、返回行数
- 根因分析(索引失效、数据倾斜、缓存穿透等)
- 采取的动作(加索引、改写、限流、拆分)
- 优化后的基线值
把这些字段做成一个Markdown模板放在团队知识库,每次大促后按要求填写,时间长了就是一份宝贵的数据库体检手册。
如何验证大促后SQL优化效果
优化完不等于结束,要用数据说话,不要只看单条SQL变快,要看整体链路的表现。
核心指标对比
建议在优化前后分别统计以下几项,做成表格看变化:
- 平均查询耗时:取P95分位数,避免被极端值带偏
- 每秒事务数:TPS是否恢复到日常水平
- 慢查询数量:按小时统计,观察尖峰是否消失
- 数据库连接池占用率:是否重新回到安全水位
以一次典型的订单库优化为例,优化前P95耗时是2.3秒,优化后降到180毫秒,慢查询的条数从每小时两千条缩减到不到一百条,这样的对比才有说服力。
压测脚本要放在线上环境跑
不少团队在测试环境压测通过,一上生产就原形毕露,因为测试环境的数据分布和线上完全不同,验证慢SQL优化,最靠谱的办法是选出业务低峰期,把优化的SQL用真实用户请求重放一遍,可以通过tcpdump抓包,再用goreplay

回放流量,注意回放时要提前通知DBA,并开启限流保护。
监控告警需要持续一周
大促后的次日通常最危险,但有些慢SQL会在三天后才浮现,比如某个商品的库存回补任务触发了历史订单查询,建议把慢查询告警阈值调低(比如超过500毫秒就告警),连续观察一周,如果一周内没有出现抖动,这个治理闭环才算真正走完。
常见问题解答
大促后慢SQL归档和普通的日志归档有什么区别?
慢SQL归档更强调“根因+动作+验证”的闭环,普通日志归档只保留原始记录,用于排查问题,慢SQL归档则要求每条记录都能回答三个问题:为什么慢?怎么解决的?优化后效果如何?这样归档出来的内容可以直接指导后续开发,相当于把故障经验变成团队的公共资产。
慢SQL治理时加了索引还是慢,可能是什么原因?
有可能是索引没有被使用,检查查询条件里是否对索引列做了函数计算,比如WHERE DATE(create_time) = '2026-05-20'就不会走索引,应该改写为create_time >= '2026-05-20' AND create_time < '2026-05-21',也可能是索引的区分度太低,比如性别字段,加索引等于没加,还有一种是隐式类型转换,字符串字段和数字比较时,索引也会失效。
云数据库和自建数据库的慢SQL治理流程有什么不同?
云数据库大多自带慢日志分析和自动索引建议,比如简米云RDS的“慢SQL分析”页面能直接看到每条SQL的执行计划,甚至给出优化前后的性能预估,自建数据库需要自己部署架构,但也有好处:可以通过管理员权限植入更细粒度的审计插件,比如Percona Toolkit的进阶用法,两者的归档逻辑完全相同,差的只是采集层的便利性,数据源不同,但治理思路是通用的。
大促后的慢SQL治理,本质上是把一次性的应急响应变成可重复执行的流程,集中治理解决当下的痛,归档解决未来的隐患,只要坚持“分级处理、归档留痕、验证闭环”这三个动作,数据库就能扛住下一轮更大的冲击。