1. 慢查询复盘概述

1.1 什么是慢查询

在 Go 后端服务中,慢查询 指执行时间超过预设阈值的数据库查询语句。这个阈值通常由业务容忍度决定,常见标准为 100ms(OLTP 在线交易)或 500ms(报表/后台任务)。慢查询不仅拖慢单次请求,更会耗尽连接池、锁住表行、引发雪崩效应。

典型慢查询特征:
  • 执行时间 > 阈值(如 100ms)
  • 扫描行数远大于返回行数(如扫描 10 万行返回 10 行)
  • 未命中索引或索引选择错误
  • 频繁触发临时表、文件排序
  • 锁等待时间占比过高
维度 正常查询 慢查询
执行时间 < 10ms > 100ms
扫描行数 与返回行数接近 远大于返回行数
索引使用 使用合适索引 全表扫描或索引失效
连接池影响 快速释放连接 长时间占用连接
Go 协程阻塞 无感知 协程堆积、内存上涨
慢查询在 Go 服务中的影响链路 用户请求 Go Handler 数据库连接池 数据库 连接池耗尽 协程堆积 内存上涨 服务响应变慢 → 超时 → 雪崩 一条慢查询可能阻塞整个连接池,导致 Go 协程排队等待,最终引发服务雪崩

1.2 为什么需要复盘

很多团队遇到慢查询时,只做“加索引”或“改 SQL”的临时修复,没有从根因上分析。复盘的核心原因有三:

  1. 根因不消除,问题会复发 — 同样的慢查询模式会在不同接口重复出现。
  2. Go 并发模型放大了慢查询影响 — 一个慢查询阻塞连接池,会导致大量 goroutine 等待,内存和延迟双双飙升。
  3. 复盘是团队能力提升的捷径 — 将个人经验沉淀为团队规范,避免后人踩坑。
常见误区: 只关注慢查询本身,忽略 Go 侧的问题(如连接池配置不当、SQL 未超时、ORM 使用不当)。复盘必须同时覆盖 数据库层 和 Go 应用层。

1.3 复盘的核心目标与价值

目标 具体内容 价值体现
定位根因 找出 SQL 执行慢的真实原因(索引、锁、数据分布、Go 代码) 避免重复修复同一类问题
量化影响 评估慢查询对延迟、吞吐量、资源消耗的具体数值 为优化优先级提供数据支撑
制定方案 输出可落地的优化措施(SQL 改写、索引调整、Go 代码重构) 直接降低 P99 延迟
沉淀规范 形成团队 SQL 编写规范、索引设计规范、Go 数据库使用规范 提升团队整体代码质量
监控预警 建立慢查询监控和自动告警机制 提前发现,避免线上故障
慢查询复盘闭环流程 发现慢查询 采集信息 根因分析 优化实施 验证效果 沉淀规范
复盘价值总结: 一次完整的慢查询复盘,不仅能解决当前问题,还能建立 发现 → 分析 → 优化 → 验证 → 沉淀 的良性循环,让 Go 服务的数据库性能持续提升。