7. 数据库性能问题怎么排查
数据库是性能测试中最常见的瓶颈之一。很多系统应用服务器资源还没打满,响应时间却明显升高,背后往往是慢 SQL、索引缺失、连接池不足、锁等待、数据量过大或数据库 IO 压力。测试人员不一定要像 DBA 一样精通所有数据库内核,但必须能从性能测试角度发现数据库问题,并推动开发或 DBA 定位优化。
面试中问数据库性能问题,重点是看你是否能从现象到 SQL、索引、连接、锁和资源指标逐步排查。
一、数据库性能问题常见现象
常见表现:
- 接口响应时间升高;
- TPS 上不去;
- 应用线程等待;
- 数据库 CPU 高;
- 数据库 IO 高;
- 慢 SQL 增多;
- 连接数打满;
- 锁等待;
- 死锁;
- 主从延迟;
- 分页查询很慢。
出现这些现象,要考虑数据库瓶颈。
二、先看慢 SQL
慢 SQL 是最常见问题。
排查点:
- SQL 执行时间;
- 执行频率;
- 是否全表扫描;
- 是否走索引;
- 返回数据量;
- 排序和分组;
- join 是否合理;
- 分页是否深分页。
慢 SQL 不是只看单次慢,还要看高频 SQL。一个 SQL 单次 50ms,但每秒执行几千次,也可能造成压力。
三、看执行计划
通过 explain 看 SQL 是否走索引。
关注:
- type;
- key;
- rows;
- Extra;
- 是否 Using filesort;
- 是否 Using temporary。
如果 rows 很大、没有 key、出现全表扫描,就要重点关注。
四、索引问题
常见索引问题:
- 查询字段无索引;
- 联合索引顺序不合理;
- 条件使用函数导致索引失效;
- like 前置百分号;
- 隐式类型转换;
- 查询条件选择性差;
- order by 未命中索引。
测试人员可以发现现象并提供 SQL、参数、数据量和执行时间。
五、连接池问题
数据库连接池不足会导致请求排队。
表现:
- 应用 CPU 不高;
- 响应时间升高;
- 日志出现等待连接;
- 连接池 active 打满;
- 数据库连接数接近上限。
要看应用连接池配置和数据库最大连接数。
六、锁等待问题
高并发写入或更新时容易出现锁等待。
场景:
- 扣库存;
- 更新订单状态;
- 抢券;
- 账户余额扣减;
- 批量更新。
表现:
- 响应时间突然变长;
- TPS 不稳定;
- 数据库锁等待增加;
- 甚至死锁。
七、深分页问题
分页查询页码很大时,可能越来越慢。
例如:
select * from orders order by create_time desc limit 100000, 20;
数据库需要扫描并跳过大量数据。
优化思路通常是基于游标或上次最大 ID 做分页。
八、数据库资源指标
需要关注:
- CPU;
- 内存;
- 磁盘 IO;
- IOPS;
- buffer pool 命中率;
- 连接数;
- 慢查询数;
- 锁等待;
- 主从延迟。
数据库问题不能只看 SQL,也要看整体资源。
九、排查案例
现象:订单查询接口压测时,100 并发响应时间 200ms,500 并发时 95 线超过 5s。
排查:
- 应用 CPU 不高;
- 日志显示订单查询耗时高;
- 数据库慢 SQL 发现 order by create_time desc 的查询;
- explain 发现未走索引;
- 增加联合索引后复测,95 线明显下降。
这类案例很适合面试表达。
十、面试回答模板
如果面试官问“数据库性能问题怎么排查”,可以这样回答:
数据库性能问题我会先从现象入手,比如接口响应时间升高、TPS 上不去、应用 CPU 不高但请求变慢。然后查看数据库慢 SQL 和执行频率,通过 explain 看是否走索引、扫描行数、是否有 Using filesort 或临时表。接着检查索引是否合理,是否存在函数、隐式转换、like 前置百分号导致索引失效。同时关注连接池是否打满、数据库连接数、锁等待、死锁、磁盘 IO 和主从延迟。如果是分页或排序接口,还会关注深分页和 order by。定位后让开发或 DBA 优化 SQL、索引或连接池配置,并通过复测验证效果。
十一、练习清单
- 找慢 SQL;
- 看 explain;
- 判断是否走索引;
- 分析连接池;
- 分析锁等待;
- 分析深分页;
- 看数据库 CPU;
- 看磁盘 IO;
- 写数据库瓶颈案例;
- 准备面试回答。
数据库性能排查的核心是 SQL、索引、连接、锁和资源指标。测试人员要能发现问题、提供证据、推动优化和复测。
配套刷题:

