慢 SQL 优化大全:从定位到实战,Spring Boot + Java 开发者必看!

视频看了几百小时还迷糊?关注我,几分钟让你秒懂!

在实际开发中,慢 SQL 是性能杀手的第一名!一个没加索引的WHERE条件,可能让接口从 10ms 变成 10s;一条全表扫描的JOIN,可能直接拖垮整个数据库。

本文将用通俗语言 + Spring Boot 实战代码 + 正反案例对比,手把手教你:

  • 如何发现慢 SQL?
  • 如何分析执行计划?
  • 如何优化常见慢查询?
  • 如何预防慢 SQL 上线?

小白也能看懂,建议收藏!


一、为什么慢 SQL 危害巨大?

🚫 反例:一个“无辜”的查询拖垮系统

// 用户服务:根据手机号查用户(看似正常) public User getUserByPhone(String phone) { return jdbcTemplate.queryForObject( "SELECT * FROM user WHERE phone = ?", new BeanPropertyRowMapper<>(User.class), phone ); }

问题在哪?

  • 如果user表有 1000 万条数据;
  • phone字段没有索引
  • 那么每次查询都要全表扫描,耗时可能 >5s;
  • 高并发下,数据库 CPU 100%,整个系统雪崩!

结论:慢 SQL 不只是“慢”,而是系统性风险


二、如何发现慢 SQL?

方法1️⃣:开启数据库慢查询日志(以 MySQL 为例)

-- 查看是否开启 SHOW VARIABLES LIKE 'slow_query_log'; -- 开启慢查询(临时) SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 1; -- 超过1秒记录 -- 指定日志文件(可选) SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

生产环境建议开启,定期分析日志。


方法2️⃣:使用 Druid 监控(Spring Boot 集成)

前面我们讲过 Druid,它能自动记录执行时间超过阈值的 SQL

# application.yml spring: datasource: druid: filter: stat: slow-sql-millis: 200 # 超过200ms算慢SQL log-slow-sql: true # 打印慢SQL日志

启动后,控制台会输出类似:

[Druid-ConnectionPool-Log] slow sql 256 ms, url:..., sql: SELECT * FROM order WHERE create_time > '2025-01-01'

方法3️⃣:APM 工具(如 SkyWalking、Arthas)

但对新手来说,Druid + 慢日志已经够用!


三、慢 SQL 优化四步法(核心!)

定位 → 分析 → 优化 → 验证

第1步:定位慢 SQL

通过上述方法找到具体 SQL。

第2步:分析执行计划(EXPLAIN)

EXPLAIN SELECT * FROM user WHERE phone = '13800138000';

重点关注:

  • type:最好为const/ref,避免ALL(全表扫描);
  • key:是否命中索引;
  • rows:扫描行数,越少越好;
  • Extra:避免Using filesortUsing temporary

理想结果

type: ref key: idx_phone rows: 1 Extra: NULL

危险信号

type: ALL key: NULL rows: 10000000 Extra: Using where

第3步:针对性优化(附正反案例)

✅ 优化1:添加缺失索引(最常用!)

反例(无索引)

-- user 表 phone 无索引 SELECT id, name FROM user WHERE phone = '138...'; -- EXPLAIN 显示 type=ALL, rows=1000万

正例(加索引)

ALTER TABLE user ADD INDEX idx_phone (phone);

再次 EXPLAIN,type=ref,rows=1,速度从 5s → 1ms!

⚠️ 注意:

  • 索引不是越多越好!写多读少的表慎加;
  • 避免在索引字段上使用函数,如WHERE YEAR(create_time) = 2025→ 索引失效!

✅ 优化2:避免 SELECT *

反例

SELECT * FROM order WHERE user_id = 1001; -- 如果 order 表有 50 个字段,包含大文本(如 content)

正例

SELECT id, order_no, amount, status FROM order WHERE user_id = 1001;

减少网络传输 + 内存占用,尤其当表有TEXT/BLOB字段时效果显著。


✅ 优化3:分页优化(深分页问题)

反例(经典慢查询)

-- 跳过 10 万条,取 10 条 SELECT * FROM product ORDER BY id LIMIT 100000, 10; -- 随着 offset 增大,越来越慢!

正例(基于游标分页)

-- 记住上一页最大 id = 100000 SELECT * FROM product WHERE id > 100000 ORDER BY id LIMIT 10;

时间复杂度从 O(N) 降到 O(1),百万级数据也快如闪电!

💡 Spring Data JPA 可用Pageable+@Query实现,MyBatis 同理。


✅ 优化4:JOIN 优化

反例(大表 JOIN 大表)

SELECT u.name, o.amount FROM user u JOIN order o ON u.id = o.user_id WHERE o.create_time > '2025-01-01'; -- 如果两表都千万级,且无索引,直接卡死

正例

  1. 确保order.user_id有索引;
  2. 先过滤再 JOIN:
SELECT u.name, o.amount FROM user u JOIN ( SELECT user_id, amount FROM order WHERE create_time > '2025-01-01' ) o ON u.id = o.user_id;

✅ 优化5:避免隐式类型转换

反例

-- phone 是 VARCHAR 类型,但传了数字 SELECT * FROM user WHERE phone = 13800138000; -- MySQL 会把 phone 转成数字比较 → 索引失效!

正例

SELECT * FROM user WHERE phone = '13800138000'; -- 字符串必须加引号!

Java 中用PreparedStatement自动处理类型,但拼接 SQL 时要小心!


第4步:验证优化效果

  • 再次EXPLAIN看执行计划;
  • 实际执行时间对比(可用System.currentTimeMillis()测试);
  • 压测验证(如 JMeter)。

四、Spring Boot 中如何预防慢 SQL?

1️⃣ 开发阶段:集成 MyBatis 拦截器打印执行时间

@Component @Intercepts({@Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class})}) public class SqlCostInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { long start = System.currentTimeMillis(); Object result = invocation.proceed(); long cost = System.currentTimeMillis() - start; if (cost > 200) { System.out.println("【慢SQL警告】耗时: " + cost + "ms"); } return result; } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } }

超过 200ms 自动告警,早发现早治疗!


2️⃣ 测试阶段:SQL 审核工具(如 SOAR、Archery)

但小团队可用人工 Code Review + EXPLAIN 检查


3️⃣ 上线前:压测 + 监控

  • 使用 JMeter 模拟高并发;
  • 观察 Druid 监控面板是否有慢 SQL;
  • 设置数据库 CPU/连接数告警。

五、常见误区 & 注意事项

❌ 误区1:“加了索引就一定快”

  • 如果查询返回 80% 的数据,MySQL 会放弃索引,直接全表扫描(因为回表成本高);
  • 复合索引顺序很重要:WHERE a=? AND b=?,索引应为(a,b),不是(b,a)

❌ 误区2:“IN 比 OR 快”

  • 小集合(<100)两者差不多;
  • 大集合 IN 可能更优,但最好用 JOIN 代替大 IN

⚠️ 注意:

  • 不要在事务中执行慢 SQL,会锁表/锁行,阻塞其他请求;
  • 定期 ANALYZE TABLE更新统计信息,让优化器选择正确索引。

六、总结:慢 SQL 优化 Checklist

问题类型优化手段
无索引添加合适索引
SELECT *只查必要字段
深分页改用游标分页(基于 ID)
大表 JOIN先过滤,再关联
函数操作索引字段改写 SQL 避免函数
隐式类型转换保证参数类型与字段一致
排序无索引为 ORDER BY 字段加索引

记住:90% 的慢 SQL,靠一个正确索引就能解决!


视频看了几百小时还迷糊?关注我,几分钟让你秒懂!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1129282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CVE-2025-61618 NR调制解调器远程拒绝服务漏洞分析

CVE-2025-61618 - NR调制解调器拒绝服务 概述 漏洞时间线 描述 在NR调制解调器中&#xff0c;由于输入验证不当&#xff0c;可能导致系统崩溃。这可能导致远程拒绝服务&#xff0c;且无需额外的执行权限。 信息 发布日期&#xff1a; 2025年12月1日 上午8:15 最后修改日期&…

游戏素材生成实战:Z-Image-Turbo快速产出角色原画方案

游戏素材生成实战&#xff1a;Z-Image-Turbo快速产出角色原画方案 在游戏开发中&#xff0c;角色原画是构建世界观与视觉风格的核心环节。传统手绘流程耗时长、成本高&#xff0c;尤其在原型设计阶段&#xff0c;频繁迭代对美术资源的响应速度提出了极高要求。随着AI图像生成技…

设计客户咨询智能回复程序,基于常见问题规则库,自动匹配答案并回复。

客户咨询智能回复系统一、实际应用场景与痛点应用场景现代企业客户服务面临海量咨询&#xff1a;- 电商客服&#xff1a;订单查询、物流跟踪、退换货、商品咨询- 银行客服&#xff1a;账户查询、转账问题、信用卡服务、理财产品- 电信客服&#xff1a;套餐咨询、话费查询、故障…

从 “模板卡壳” 到 “一键成稿”:Paperzz 开题报告如何打通硕士开题的全流程

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 开题报告https://www.paperzz.cc/proposal 一、硕士开题报告&#xff1a;不是 “走流程”&#xff0c;是 “研究能否落地的生死关” 对硕士研究生而言&#xff0c;开题报告不是 “随便填的模板…

一张手绘流程图,胜过10页PPT:制造业销售的现场说服力

在制造业的销售工作中&#xff0c;很多销售人员都习惯用精心制作的PPT来展示产品的优势、技术参数和成功案例&#xff0c;然而在实际拜访客户&#xff0c;尤其是面对车间主管、工程师等一线决策者时&#xff0c;很多时候一张简单的手绘流程图&#xff0c;比那些华丽的演示文稿更…

是否需要微调模型?M2FP预训练权重覆盖常见人体姿态场景

是否需要微调模型&#xff1f;M2FP预训练权重覆盖常见人体姿态场景 &#x1f4d6; 项目简介&#xff1a;M2FP 多人人体解析服务 在计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项细粒度的语义分割任务&#xff0c;目标是将人体图像中的每个像…

Paperzz 打头阵:7 款 AI 开题报告工具,把 “开题焦虑” 变成 “一键通关”

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 开题报告https://www.paperzz.cc/proposal 当 “开题报告改 5 版还被导师打回”“PPT 排版熬到凌晨” 成为学术入门的 “标配难题”&#xff0c;AI 工具正在把 “开题” 从 “体力战” 变成 “…

cuda不可用时的选择:M2FP CPU版填补无卡场景空白

cuda不可用时的选择&#xff1a;M2FP CPU版填补无卡场景空白 在深度学习应用日益普及的今天&#xff0c;GPU 已成为多数视觉模型推理的标配硬件。然而&#xff0c;在实际落地过程中&#xff0c;大量边缘设备、开发测试环境或低成本部署场景中并不具备独立显卡支持&#xff0c;甚…

Z-Image-Turbo风格关键词库整理:摄影/油画/动漫全覆盖

Z-Image-Turbo风格关键词库整理&#xff1a;摄影/油画/动漫全覆盖 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥 运行截图本文为Z-Image-Turbo WebUI的风格化提示词系统深度解析与实战指南。基于阿里通义实验室发布的Z-Image-Turbo模型&#xff0c;结合Dif…

智慧健身房落地案例:M2FP驱动AI教练动作对比功能

智慧健身房落地案例&#xff1a;M2FP驱动AI教练动作对比功能 在智能健身设备快速迭代的今天&#xff0c;如何实现精准、实时且低成本的人体动作分析&#xff0c;成为智慧健身房系统设计的核心挑战。传统姿态估计算法多依赖关键点检测&#xff0c;在多人场景下易受遮挡、光照变化…

M2FP是否依赖CUDA?答案是否定的,纯CPU环境完美运行

M2FP是否依赖CUDA&#xff1f;答案是否定的&#xff0c;纯CPU环境完美运行 &#x1f9e9; M2FP 多人人体解析服务 (WebUI API) 项目背景与核心价值 在当前计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 是一项关键的细粒度语义分割任务&#xff0…

低成本实现虚拟换装:M2FP镜像部署+Flask WebUI快速集成

低成本实现虚拟换装&#xff1a;M2FP镜像部署Flask WebUI快速集成 &#x1f9e9; M2FP 多人人体解析服务 (WebUI API) 项目背景与技术价值 在虚拟试衣、AR换装、数字人生成等应用场景中&#xff0c;精准的人体语义分割是核心前置能力。传统方案依赖昂贵的GPU服务器和复杂的环境…

Paperzz 开题报告:把 “开题焦虑” 变成 “1 小时出 PPT + 报告” 的学术爽感

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 开题报告https://www.paperzz.cc/proposal 开题阶段的崩溃&#xff0c;往往是 “报告写不明白&#xff0c;PPT 逻辑混乱” 的双重夹击 —— 既要凑够研究背景、文献综述、研究方法的内容&#…

【毕业设计】SpringBoot+Vue+MySQL 教师工作量管理系统平台源码+数据库+论文+部署文档

摘要 随着高校规模的不断扩大和教学管理的日益复杂化&#xff0c;教师工作量管理成为高校教务工作中的重要环节。传统的手工记录和Excel表格管理方式效率低下&#xff0c;容易出错&#xff0c;且难以实现数据的实时共享和统计分析。教师工作量涉及教学、科研、社会服务等多个维…

paperzz 开题报告:从文字到 PPT,1 个工具搞定开题答辩的 “全流程武器”

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 开题报告https://www.paperzz.cc/proposal 开题答辩是学术研究的 “第一道关卡”—— 既要拿出逻辑严谨的开题报告&#xff0c;又得准备清晰直观的 PPT&#xff0c;不少研究者光是打磨这两项材…

华为鸿蒙HarmonyOS:超越iOS,中国第二大操作系统的崛起之路

开发者平台 在科技飞速发展的今天&#xff0c;操作系统的竞争日益激烈。近日&#xff0c;全球知名研究机构Counterpoint发布的最新数据引发了业界的广泛关注——华为自主研发的鸿蒙HarmonyOS在中国市场的份额实现了惊人的增长&#xff0c;从2023年一季度的8%飙升至2024年一季度…

地址数据对齐难?阿里开源MGeo镜像+单卡4090D快速部署解决显存瓶颈

地址数据对齐难&#xff1f;阿里开源MGeo镜像单卡4090D快速部署解决显存瓶颈 在城市计算、物流调度、地图服务等场景中&#xff0c;地址数据的实体对齐是构建统一空间知识图谱的关键环节。然而&#xff0c;中文地址存在表述多样、缩写习惯差异、层级结构不一致等问题——例如“…

Z-Image-Turbo汉服人物造型生成实践

Z-Image-Turbo汉服人物造型生成实践 项目背景与技术选型动机 近年来&#xff0c;AI图像生成技术在文化创意领域展现出巨大潜力&#xff0c;尤其在传统服饰复原、数字人设创作等方向。汉服作为中华传统文化的重要载体&#xff0c;其视觉表达对细节、色彩和构图有极高要求。传统…

Z-Image-Turbo电竞赛事宣传:战队海报、对战场景图创作

Z-Image-Turbo电竞赛事宣传&#xff1a;战队海报、对战场景图创作 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥 在AI内容生成技术飞速发展的今天&#xff0c;视觉创意的生产效率正被重新定义。阿里通义实验室推出的 Z-Image-Turbo 模型&#xff0c;作为…

手部识别不准?M2FP对细小部位优化显著优于通用分割模型

手部识别不准&#xff1f;M2FP对细小部位优化显著优于通用分割模型 &#x1f4d6; 项目简介&#xff1a;为何选择M2FP进行人体解析&#xff1f; 在当前计算机视觉领域&#xff0c;人体解析&#xff08;Human Parsing&#xff09; 已成为智能服装推荐、虚拟试衣、动作分析和AR/V…