SQL优化

<aside> 💡

先熟悉索引,然后根据监控排查,先合理使用、优化索引、业务缓存、参数调优、使用内核功能

索引

自身优化

五个维度优化

Mysql性能优化方向

索引优化

MySQL 参数调优

内核优化

分区表

分库分表

其他

RDS 优化工具优化

MySQL hint 热点 | 热点行更新

索引、业务、参数配置

</aside>

上线优化

<aside> 💡

DMS RDS 无锁变更介绍

无锁变更

</aside>

整体方案

通过“可观测性三位一体”——日志(Log)、指标(Metrics)、追踪(Tracing)——构建完整的性能诊断体系,结合具体场景选用专业工具,快速定位瓶颈所在,实现从宏观到微观的逐层下钻分析

工具 用途 特点
MySQL Slow Log + pt-query-digest 慢 SQL 分析 开启慢查询日志后,使用 pt-query-digest 对日志进行统计分析,自动识别执行时间长、扫描行数多的 SQL,输出优化建议
EXPLAIN / ANALYZE 执行计划查看 使用 EXPLAIN 查看 SQL 执行计划,判断是否走索引、是否存在全表扫描;在 PostgreSQL 中可用 ANALYZE 实际执行并返回真实耗时数据
SkyWalking / Zipkin 分布式链路追踪 在微服务架构中追踪单个请求的完整调用路径,精准识别哪个服务或远程调用(如 RPC、DB)导致接口整体变慢
Redis CLI / RedisInsight 缓存监控 通过 INFO 命令或可视化工具 RedisInsight 查看缓存命中率、内存使用情况和连接数,判断是否存在缓存穿透、雪崩等问题
Prometheus + Grafana 系统指标监控 采集应用和数据库的 QPS、响应延迟、连接数、CPU/内存等关键指标,通过仪表盘实时观察异常波动,辅助定位性能拐点
Arthas(Alibaba) Java 应用诊断 当接口慢但外部依赖正常时,使用 Arthas 在线诊断 JVM 内部方法执行耗时,无需重启即可 trace 某个方法的调用栈与耗时分布

预防

实践 说明
上线前 SQL 审核 使用 SQL Lint 工具(如 Alibaba SQLAdvisor、Soar)进行自动化检查,结合人工 Review,拦截高风险 SQL(如全表扫描、隐式类型转换)。
建立索引规范 制定统一的索引命名规则(如 idx_字段名uk_字段名),明确创建标准:优先覆盖高频查询条件、避免过度索引影响写性能。
设置监控告警 对数据库慢 SQL(执行时间 > 1s)和接口 P99 响应时间设置动态阈值报警,及时发现异常波动,做到问题早感知、早处理。

整体思路

image.png

## 一、核心痛点与核心方案
- 核心痛点
  - 数据访问效率低(慢SQL)
  - 调用链路开销大(慢接口)
- 核心方案
  - 精准定位(监控+日志分析)
  - 分层优化(数据库/应用/架构层)
- 现象
  - 慢SQL:耗时>200ms、资源占用上升
  - 慢接口:超时、卡顿、服务降级
- 根本原因
  - 数据库层:缺索引、全表扫描、锁等待等
  - 应用层:逻辑嵌套深、N+1查询、未用缓存等
  - 架构层:同步阻塞多、依赖链长、资源不足等
## 二、问题判断(SQL/接口)
- 步骤1:查看接口调用链路(APM工具)
  - 判定DB耗时占比(>70%为SQL问题)
  - 检查外部服务延迟/超时
  - 排查系统资源异常(Full GC、CPU飙升)
- 步骤2:提取慢SQL
  - 启用慢查询日志(SET long_query_time=1)
  - 实时监控(SHOW PROCESSLIST)
  - 分析执行计划(EXPLAIN FORMAT=JSON)
- 步骤3:确认N+1查询
  - 特征:循环查库、相似SQL高频调用
  - 检测:APM监控、ORM日志、工具提示
## 三、慢SQL解决方案
- 索引优化
  - 创建联合索引(WHERE/JOIN/ORDER BY字段)
  - 遵循最左前缀原则
  - 避免索引列用函数/表达式
- 查询语句结构优化
  - 显式指定字段(避SELECT*)
  - 合理分页(游标分页替代深度LIMIT)
  - 子查询转JOIN(提升执行效率)
- 执行计划分析(EXPLAIN)
  - 关键字段:type(目标ref/range)、key、rows、Extra
  - 优化方向:避全表扫描、Using filesort、Using temporary
## 四、慢接口解决方案
- 缓存优化
  - 适用场景:读多写少、更新频率低
  - 方案:Redis缓存、合理TTL设置
  - 问题应对:穿透(空值缓存)、雪崩(随机TTL)、击穿(互斥锁)
- 异步化与解耦
  - 适用场景:日志、通知、统计上报
  - 方案:消息队列(Kafka/RocketMQ)
  - 问题应对:MQ有序性、零丢失、幂等性
- 批量处理(避N+1查询)
  - 批量查询+内存映射
  - 分页预加载关联项
- 接口层级优化
  - 合并接口(减少HTTP请求)
  - 按需取数(GraphQL)
  - 响应压缩(GZIP)
## 五、架构层优化
- 可观测性三位一体(日志+指标+追踪)
  - 慢SQL分析:MySQL Slow Log+pt-query-digest
  - 执行计划:EXPLAIN/ANALYZE
  - 链路追踪:SkyWalking/Zipkin
  - 缓存监控:Redis CLI/RedisInsight
  - 系统指标:Prometheus+Grafana
  - 应用诊断:Arthas(Java)
- 性能保障体系(预防-监控-治理)
  - 预防:SQL审核、索引规范、监控告警
  - 优化Checklist(6项核心检查)
  - 团队协作:性能看板、CI集成、专项优化周
- 服务拆分
  - 拆分依据:业务/性能/数据维度
  - 核心价值:消资源竞争、缩故障范围、精细化优化
## 六、总结
- 核心流程:发现问题→定位根因→分层优化→验证效果
- 思维提升
  - 从被动救火到主动防控
  - 统一观测+分层定界+精准下钻+持续治理
  - 性能优化是工程文化的体现