首页/开发/软件测试速查/数据库瓶颈识别

数据库瓶颈识别

数据库瓶颈信号:慢查询、锁等待、连接池耗尽、主从延迟、缓存命中率下降;压测中结合慢日志、执行计划与连接池、锁等待指标,区分 SQL 问题与容量问题。

软件测试速查开发更新于 2026-10-13

数据库瓶颈怎么查

压测吞吐上不去、延迟一路攀升时,先看数据库的四类信号:慢查询(执行计划)、锁等待(阻塞链)、连接池(排队还是耗尽)、资源(CPU 与磁盘 IO)。多数「应用慢」最终落到一条没有合适索引的 SQL,或一把被长事务占着的锁;定位靠证据——压测时同步采集的慢日志与指标。

基本信息

信号一慢查询日志与慢语句 TOP:按总耗时排序,而不是单次耗时
信号二锁等待:MySQL 看 InnoDB 状态与元数据锁,PostgreSQL 查 pg_locks
信号三连接数:活跃、空闲、等待三个数量,池上限与数据库上限对齐
信号四资源:数据库 CPU、磁盘 IO、缓冲命中率曲线
常见根因缺索引、隐式类型转换让索引失效、N 加 1 查询、大事务、批量提交
采集时机压测同时采集,事后靠猜会让优化无法对比

排查语句示例

排查语句示例
-- MySQL:看当前连接与执行状态
SHOW PROCESSLIST;
-- 执行计划:关注 type=ALL 全表扫描与 rows 估计值
EXPLAIN SELECT * FROM orders WHERE user_id = 42 AND status = 'PAID';
-- PostgreSQL:查看未授予的锁(等待链)
SELECT * FROM pg_locks WHERE NOT granted;

典型使用场景

  • 压测吞吐平顶:定位是哪条 SQL 或哪把锁卡住
  • 慢接口解剖:对比有无索引的执行计划差异
  • 上线前 SQL 评审:新查询先跑一次执行计划
  • 连接池调优:池上限与数据库容量匹配
  • 故障复盘:锁等待引发的级联雪崩
  • 批量任务排查:大事务把在线请求一起堵住

现象与优先怀疑

现象优先怀疑验证方式
QPS 平顶、库 CPU 饱和热点 SQL 缺索引执行计划与慢日志 TOP
延迟锯齿波动锁竞争或长事务锁等待查询与事务时长
报连接耗尽池上限太小或占用不释放连接数与池监控
IO 持续打满全表扫描或排序落盘执行计划与 IO 指标
先采集后优化:压测同步打开慢日志与指标面板,否则「优化前后」没有可信的对照数据。
索引不是越多越好:每个索引都在写路径上加成本,看读吞吐的同时也要盯写吞吐是否被拖慢。
应用与数据库混部会互相抢资源:指标失真、优化方向跑偏,压测尽量用独立实例。

易错点

  • 只看执行计划估计不跑实际分析:估计行数与实际差几个量级,结论错误
  • 只盯单条 SQL 不看调用总量:单次 10 毫秒乘十万次才是真瓶颈
  • 连接池调大但数据库上限不够:换个地方报错,容量要两端一起算
  • 优化改在测试库、生产慢日志从不看:线上分布与测试数据完全不同
  • 忽略写路径成本:加索引快了查询,写入吞吐悄悄恶化

数据来源与参考

  • MySQL 官方文档:慢查询日志与 EXPLAIN
  • PostgreSQL 官方文档:EXPLAIN 与统计视图
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌