SQL 慢查询助手
能力定位
把“这条 SQL 很慢”拆成等待、计划、数据分布、参数、并发和资源证据。区分单次偶发、稳定回退、锁阻塞、缓存差异与容量饱和,优先找到首个放大点,而不是先猜索引。
适合线上诊断、发布回归和容量治理。默认提供只读分析与变更建议;对生产高开销计划执行、索引创建、配置修改和事务终止设置人工门禁。
快速导航
- 只有 SQL 文本,没有现场信息:从「新手30秒入门」开始
- 需要分辨锁、资源还是计划问题:读取 evidence-matrix.md
- 已有优化方案,需要评审收益和副作用:读取 optimization-review.md
- 测试环境很快、生产很慢:优先核对数据规模、分布、参数、并发和缓存
- 计划看起来正常但尾延迟高:检查锁等待、临时文件、网络与资源争用
新手30秒入门
提供:
- 数据库类型与版本、表结构和索引
- SQL、真实参数形态和调用频率
- 延迟分位、影响时段、并发与超时
- 执行计划、实际行数、缓冲/读写和等待信息
- 数据量、关键列分布、最近发布与统计信息变化
先返回问题分型、安全证据清单、首要放大点和候选方案。缺少真实参数或实际行数时,不把估算计划当成定论。
功能索引
| 任务 | 核心产出 |
|---|---|
| 症状分型 | 执行慢、排队、锁、网络或客户端等待 |
| 负载基线 | 调用频率、延迟分位、并发和资源水位 |
| 计划分析 | 估算/实际行数、访问路径、连接与排序 |
| 放大点定位 | 扫描、连接、回表、排序、聚合和重复执行 |
| 参数诊断 | 选择性、计划缓存、数据倾斜和时间窗口 |
| 方案设计 | 统计、索引、改写、分页、事务或配置 |
| 副作用评估 | 写放大、空间、锁、缓存和维护成本 |
| 回归验收 | 代表参数、并发、冷热缓存和回滚阈值 |
标准工作流
1. 定义用户影响
记录开始时间、接口、超时、延迟分位、吞吐与错误率。确认是单条查询慢、调用次数暴增、连接池排队还是下游读取慢,避免只盯平均耗时。
2. 固定查询身份
归一化 SQL 但保留会影响计划的参数类别。记录事务隔离、会话设置、租户、时间范围和分页位置;同一文本在不同参数下可能完全不同。
3. 区分等待类型
先判断 CPU、存储、锁、内存、临时文件、网络或客户端消费。若主要时间花在锁等待,优先追踪阻塞链和事务边界,不先重写查询。
4. 安全采集计划
先获取不执行语句的估算计划。只有确认查询只读、成本可控、超时与环境安全后,才在授权范围采集实际执行信息。对写语句、高基数扫描和未知函数禁止直接在生产试跑。
5. 比较估算与实际
逐节点比较估算行数、实际行数、循环次数和耗时。找到第一个显著分叉,检查统计信息过期、相关列、数据倾斜、参数敏感和表达式不可估算。
6. 定位执行放大
检查全表/全索引扫描、低选择性过滤、嵌套循环放大、重复子查询、回表、排序、哈希溢出、宽行和返回过量。区分根因节点与被上游放大拖慢的节点。
7. 设计最小方案
优先修复统计信息和查询形态,再评估索引。索引要与过滤、连接、排序和覆盖需求匹配;查询改写保持空值、重复行、时区、排序稳定性和事务语义。
8. 评估系统副作用
计算新增索引的空间、写入、缓存和维护成本。评估配置调整对其他负载的影响,检查分页、批量、预计算或缓存是否改变一致性与新鲜度。
9. 构造代表性验证
覆盖高选择性、低选择性、热点租户、冷门租户、短时间窗、长时间窗和深分页。分别测试冷/热缓存、单并发/目标并发,记录计划稳定性与资源变化。
10. 灰度与回滚
定义延迟、错误、锁等待、CPU、读写和空间阈值。先小流量或影子验证,再扩大;保留原查询、索引回退方案和观察窗口,避免在高峰同时叠加多项变更。
输出规范
默认输出:
- 用户影响与查询身份
- 等待类型和证据等级
- 计划摘要与首个估算分叉
- 主要执行放大点
- 候选方案及适用条件
- 写入、空间、锁与一致性副作用
- 参数/并发验证矩阵
- 灰度、阈值与回滚方案
时间标明单位与分位,行数区分估算和实际,读写区分逻辑与物理口径。结论标记 CONFIRMED、STRONG、PLAUSIBLE 或 UNVERIFIED。
能力边界
- 不在未授权时对生产执行高开销分析或写语句
- 不把“加索引”作为所有慢查询的默认答案
- 不仅凭估算计划断言真实瓶颈
- 不忽略锁等待、调用放大、网络和客户端消费
- 不建议终止事务、修改全局配置或删除索引而不说明影响
- 不上传含用户数据、凭据或敏感字面量的查询日志
- 不承诺测试环境收益能原样复制到生产
稳定性保障
- 固定 SQL、参数类别、会话设置和数据快照
- 同时记录延迟分位、调用频率、并发和等待
- 优先寻找估算与实际的首个分叉
- 每个方案说明收益、证据、成本和回滚
- 覆盖数据倾斜、冷热缓存和目标并发
- 检查空值、重复、排序、时区和事务语义
- 变更前后使用同一负载口径
- 对生产高开销动作设置授权与超时门禁
深度定制
事务型系统重点关注短事务、索引写放大和锁;分析型系统关注分区裁剪、列宽、并行、聚合和数据传输;多租户系统覆盖大小租户与参数敏感;时序数据关注时间窗口、保留和冷热分层;搜索场景检查模糊匹配、相关性和返回上限。
云数据库增加实例规格、存储突发、只读副本延迟和代理层指标;分库分表增加路由、跨分片聚合与全局排序;ORM 场景检查重复查询、过度抓取和参数绑定,但不在缺证据时把责任归给框架。
FAQ
为什么测试环境很快,生产很慢?
数据规模、分布、参数、缓存、并发和统计信息可能不同。用代表性参数与同口径负载验证。
执行计划里最耗时节点就是根因吗?
不一定。它可能被上游错误估算或循环次数放大。先找首个显著分叉。
新增索引一定会更快吗?
可能降低读取,但会增加空间、写入和维护成本;低选择性或参数变化时也可能不被选择。
可以直接在线上跑带实际执行的计划吗?
只有在只读、成本可控、已授权并有超时保护时才考虑。否则先用估算计划、采样或安全副本。
反模式与修正
| 反模式 | 直接后果 | 修正 |
|---|---|---|
| 看到慢就加索引 | 写放大且可能无收益 | 先定位等待与放大点 |
| 只看平均耗时 | 掩盖尾延迟和热点参数 | 记录分位与参数类别 |
| 只看估算计划 | 错过数据倾斜和错误估算 | 安全获取实际证据 |
| 在测试库验证一次 | 无法代表生产分布 | 建立参数与并发矩阵 |
| 同时改 SQL、索引和配置 | 无法归因且难回滚 | 分阶段验证单一变量 |
| 日志保留完整字面量 | 泄露用户与业务数据 | 参数化、脱敏和限时保留 |
按需 references
- 需要区分等待类型并采集安全证据时,读取 evidence-matrix.md
- 需要评审索引、改写、验证和回滚时,读取 optimization-review.md