关于数据库慢sql的优化

数据库 SQL 调优的几个关键方面


1. 索引优化

  • 添加合适的索引:对 WHERE、JOIN、ORDER BY、GROUP BY 中频繁使用的列建立索引
  • 避免索引失效
    • 不在索引列上使用函数或运算(如 WHERE YEAR(create_time) = 2026 会导致索引失效)
    • 避免隐式类型转换(如字符串列用数字查询)
    • 避免使用 !=<>NOT INIS NULL 等导致索引失效的操作
    • 避免左侧模糊查询(LIKE '%xxx'
  • 联合索引遵循最左前缀原则:合理安排联合索引列的顺序
  • 覆盖索引:让查询只需要访问索引而无需回表

2. SQL 语句优化

  • **避免 SELECT ***:只查询需要的列,减少数据传输和 I/O
  • 合理使用 JOIN
    • 小表驱动大表
    • 避免多表关联(建议不超过 3 张表)
    • 确保 JOIN 条件列有索引
  • 子查询优化:将子查询改写为 JOIN,某些场景下性能更好
  • 分页优化:深分页场景使用 WHERE id > ? LIMIT N 替代 OFFSET 方式
  • UNION 优化:能用 UNION ALL 就不用 UNION(避免去重排序)
  • 批量操作:用批量 INSERT 代替逐条 INSERT

3. 执行计划分析

  • 使用 EXPLAIN / EXPLAIN ANALYZE 分析 SQL 执行计划,重点关注:
    • type:访问类型,避免 ALL(全表扫描),目标是 refrange 及以上
    • key:实际使用的索引
    • rows:预估扫描行数
    • Extra:避免出现 Using filesortUsing temporaryUsing filesort

4. 表结构优化

  • 字段类型选择:使用最合适的最小数据类型(如 TINYINT 代替 INT 表示状态值)
  • 避免过大字段:大文本字段单独存储,避免影响主表查询性能
  • 适度反范式化:为了查询性能,可以适当增加冗余字段减少 JOIN
  • 分区表:对大表按时间或范围分区,提升查询和维护效率
  • 冷热数据分离:历史数据归档到归档表

5. 数据库配置优化

  • 连接池参数:合理配置连接池大小(如 HikariCP 的 maximumPoolSize
  • 缓冲区配置:调整 innodb_buffer_pool_sizesort_buffer_size
  • 超时设置:合理设置锁等待超时、查询超时
  • 慢查询日志:开启慢查询日志(slow_query_log),设置合理的 long_query_time

6. 业务层面优化

  • 减少非必要查询:引入缓存(Redis/Memcached),避免重复查库
  • 异步处理:非实时需求改为异步/消息队列处理
  • 读写分离:读请求走从库
  • 分库分表:单表数据量过大时考虑水平拆分
  • 限流降级:高并发场景下对非核心查询进行限流

实际操作中的调优流程

1. 开启慢查询日志,定位慢 SQL
       ↓
2. EXPLAIN 分析执行计划,找出瓶颈
       ↓
3. 针对性优化(索引 / SQL改写 / 表结构调整)
       ↓
4. 验证优化效果(对比执行时间、扫描行数)
       ↓
5. 上线观察,持续监控
posted @ 2026-05-13 14:07  webzd  阅读(1)  评论(0)    收藏  举报