适用人群:
- Spring Boot + MyBatis / MyBatis-Plus 项目
- 已上线 Linux / Docker
- 接口变慢、SQL 性能不可控
目标:
- 只记录 慢 SQL(如 >500ms)
- 单独生成
slow-sql.log- 不改业务代码
- 生产环境可用
一、什么是慢 SQL 日志?
慢 SQL 日志,就是把“执行时间超过指定阈值的 SQL”单独记录下来,用于定位数据库性能瓶颈。
比如:
耗时 1350ms
SELECT * FROM order o
LEFT JOIN order_item oi ON ...
通过慢 SQL 日志,你可以快速回答:
- 哪条 SQL 最慢?
- 是不是没走索引?
- 为什么接口一到高峰就卡?
二、为什么推荐 P6Spy?
在 Spring Boot 项目中,慢 SQL 常见方案有三种:
| 方案 | 特点 | 是否推荐 |
|---|---|---|
| MyBatis SQL 日志 | 记录所有 SQL | ❌ 生产不建议 |
| 数据库慢日志 | DBA 级别 | ⚠️ 应用侧不可控 |
| P6Spy | JDBC 层拦截,记录耗时 | ✅ 强烈推荐 |
P6Spy 的优势:
- 不改任何业务代码
- 能看到真实 SQL + 执行耗时
- 可精确控制“超过多少 ms 才记录”
- 和 logback 完美配合
三、整体实现思路
JDBC / MyBatis
↓
P6Spy(统计 SQL + 耗时)
↓
Slf4j 日志(logger = p6spy)
↓
logback
↓
logs/slow-sql.log
四、完整配置步骤(一步不缺)
1️⃣ 引入 P6Spy 依赖
p6spy
p6spy
3.9.1
2️⃣ 修改数据源驱动(关键)
原配置:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test
修改为:
spring:
datasource:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:mysql://127.0.0.1:3306/test
说明:
- 核心是
jdbc:p6spy:mysql://- Oracle / 达梦等数据库同理
3️⃣ 新增 P6Spy 配置文件
文件路径:
src/main/resources/spy.properties
推荐配置(生产可用):
使用 SLF4J 输出(交给 logback)
appender=com.p6spy.engine.spy.appender.Slf4JLogger
SQL 日志格式
logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat
慢 SQL 阈值(毫秒)
executionThreshold=500
开启慢 SQL 检测
outagedetection=true
outagedetectioninterval=500
排除无用类型
excludecategories=info,debug,result,commit,rollback,batch
时间格式
dateformat=yyyy-MM-dd HH:mm:ss
启用模块
modulelist=com.p6spy.engine.spy.P6SpyFactory
核心配置只有一句:
executionThreshold=500
4️⃣ logback 中配置慢 SQL 日志文件
① 新增 slow-sql appender
<appender name="SLOW_SQL_FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
${LOG_PATH}/slow-sql.log
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
${LOG_PATH}/slow-sql.%d{yyyy-MM-dd}.log
30
%msg%n
② 配置 P6Spy 专用 logger
⚠️ 注意:
- 不要挂到
rootadditivity=false防止慢 SQL 混入业务日志
五、最终生成的日志结构
logs/
├─ web.log
├─ info.log
├─ error.log
├─ slow-sql.log
├─ slow-sql.2026-01-07.log
查看慢 SQL:
tail -f slow-sql.log
六、慢 SQL 日志示例
2026-01-07 11:42:18 | took 1356ms |
SELECT o.id, o.name
FROM order o
LEFT JOIN order_item oi ON ...
WHERE o.create_time > ?
一眼就能判断:
- SQL 是否复杂
- 是否需要加索引
- 是否需要拆表 / 优化条件
七、生产环境使用建议(非常重要)
1️⃣ 只在 prod 环境开启
application-prod.yml
spring:
datasource:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
2️⃣ 不要记录全部 SQL
- 全量 SQL 日志 = 性能杀手
- 慢 SQL 才是你真正关心的
3️⃣ 出问题如何快速关闭?
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
重启即可恢复。
八、总结
一句话总结慢 SQL 日志的价值:
接口慢不可怕,可怕的是你不知道慢在哪。
通过 P6Spy + logback:
- 你能精准定位性能瓶颈
- 你能用数据而不是感觉说话
- 你能把“偶现慢”变成“可复现问题”
这一步,是从“能写业务代码”走向“能扛生产”的分水岭。
如果你觉得这篇文章有用,欢迎点赞 / 收藏 / 评论交流 👏 后续可以继续分享:
- SQL 自动 EXPLAIN
- 慢接口日志
- 高并发下日志优化实践