SQL性能优化

返回

SQL性能优化

一、为什么压测问题经常落到 SQL

在很多 Java 后端系统里,真正拖慢接口的不是业务代码,而是数据库。

典型表现:

  • QPS 提不上去
  • RT 很高
  • CPU 不一定高

继续分析后发现:

  • 某条 SQL 很慢
  • 数据库连接池被占满
  • 锁等待严重

所以:

SQL 优化,是后端性能优化里非常核心的一环。


二、什么是慢 SQL

慢 SQL 并不是固定“几秒以上才算慢”,而是:

在当前业务场景下,显著拖慢接口响应的 SQL。

例如:

  • 列表接口要求 100ms 内返回
  • 但 SQL 就占了 80ms

这种 SQL 即使没到 1 秒,也已经值得关注。


三、常见 SQL 性能问题

后端项目里最常见的问题包括:

  • 没有合适索引
  • 走错索引
  • 全表扫描
  • 返回数据太多
  • 复杂 join 过多
  • 排序和分页不合理

这些问题在数据量上来后会被迅速放大。


四、先学会看执行计划

SQL 优化最基本的动作是看执行计划。

常用工具:

EXPLAIN

你要重点关注:

  • 是否命中索引
  • 是否全表扫描
  • 扫描行数是否过大
  • 是否有临时表
  • 是否有文件排序

这一步比“凭感觉优化”更可靠。


五、索引为什么重要

索引的本质,是减少扫描成本。

没有索引时:

数据库可能要扫很多行

有合适索引时:

数据库可以快速定位目标数据

但要注意:

  • 有索引不代表一定快
  • 索引建错也没用
  • 索引太多会影响写入

六、Java 后端常见错误写法

1. 查询条件没走索引

例如:

  • 对索引字段做函数处理
  • 隐式类型转换

2. 一次查太多列

例如:

select *

很多时候并不需要所有字段。

3. 分页过深

例如:

limit 100000, 20

这类深分页在大表上成本很高。


七、锁和事务也会拖慢 SQL

有些慢并不是查询本身复杂,而是被锁住了。

例如:

  • 长事务不提交
  • 更新热点行
  • 大量并发修改同一记录

表现为:

  • SQL 等待时间长
  • RT 偶发飙高
  • 压测越高并发越明显

八、一个简单优化案例

假设你有一条订单查询:

select * from orders where user_id = ? and status = ?

压测时发现耗时很高。

查看执行计划后发现:

没有命中合适索引

优化方向通常是:

  • 建联合索引
  • 只查必要字段
  • 控制返回记录数

然后再压测对比结果。


九、SQL 优化不是只看单条语句

真实系统里,还要考虑:

  • SQL 调用频率
  • 并发访问模式
  • 是否命中缓存
  • 是否和写操作竞争

有些 SQL 单次不算慢,但因为调用量巨大,也会成为瓶颈。


十、后端工程师的实用建议

如果你是 Java 后端开发,做 SQL 优化时建议:

  1. 先抓最慢、最频繁的 SQL
  2. 先看执行计划,再改索引
  3. 先减少扫描量,再谈复杂优化
  4. 优化后一定重新压测验证

十一、总结

SQL 性能优化最核心的原则是:

  • 先定位
  • 再解释
  • 最后验证

对压测来说,一条慢 SQL 经常足以拖垮整条链路。
所以只要你能把 SQL 问题分析清楚,很多接口性能问题就已经解决了一半。