1. 慢查询复盘概述
1.1 什么是慢查询
在 Go 后端服务中,慢查询 指执行时间超过预设阈值的数据库查询语句。这个阈值通常由业务容忍度决定,常见标准为 100ms(OLTP 在线交易)或 500ms(报表/后台任务)。慢查询不仅拖慢单次请求,更会耗尽连接池、锁住表行、引发雪崩效应。
典型慢查询特征:
- 执行时间 > 阈值(如 100ms)
- 扫描行数远大于返回行数(如扫描 10 万行返回 10 行)
- 未命中索引或索引选择错误
- 频繁触发临时表、文件排序
- 锁等待时间占比过高
| 维度 | 正常查询 | 慢查询 |
|---|---|---|
| 执行时间 | < 10ms | > 100ms |
| 扫描行数 | 与返回行数接近 | 远大于返回行数 |
| 索引使用 | 使用合适索引 | 全表扫描或索引失效 |
| 连接池影响 | 快速释放连接 | 长时间占用连接 |
| Go 协程阻塞 | 无感知 | 协程堆积、内存上涨 |
1.2 为什么需要复盘
很多团队遇到慢查询时,只做“加索引”或“改 SQL”的临时修复,没有从根因上分析。复盘的核心原因有三:
- 根因不消除,问题会复发 — 同样的慢查询模式会在不同接口重复出现。
- Go 并发模型放大了慢查询影响 — 一个慢查询阻塞连接池,会导致大量 goroutine 等待,内存和延迟双双飙升。
- 复盘是团队能力提升的捷径 — 将个人经验沉淀为团队规范,避免后人踩坑。
常见误区: 只关注慢查询本身,忽略 Go 侧的问题(如连接池配置不当、SQL 未超时、ORM 使用不当)。复盘必须同时覆盖 数据库层 和 Go 应用层。
1.3 复盘的核心目标与价值
| 目标 | 具体内容 | 价值体现 |
|---|---|---|
| 定位根因 | 找出 SQL 执行慢的真实原因(索引、锁、数据分布、Go 代码) | 避免重复修复同一类问题 |
| 量化影响 | 评估慢查询对延迟、吞吐量、资源消耗的具体数值 | 为优化优先级提供数据支撑 |
| 制定方案 | 输出可落地的优化措施(SQL 改写、索引调整、Go 代码重构) | 直接降低 P99 延迟 |
| 沉淀规范 | 形成团队 SQL 编写规范、索引设计规范、Go 数据库使用规范 | 提升团队整体代码质量 |
| 监控预警 | 建立慢查询监控和自动告警机制 | 提前发现,避免线上故障 |
复盘价值总结: 一次完整的慢查询复盘,不仅能解决当前问题,还能建立 发现 → 分析 → 优化 → 验证 → 沉淀 的良性循环,让 Go 服务的数据库性能持续提升。