Spring Boot 项目慢 SQL 日志实战:P6Spy 一步到位

33 阅读3分钟

适用人群:

  • 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 级别⚠️ 应用侧不可控
P6SpyJDBC 层拦截,记录耗时强烈推荐

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

⚠️ 注意:

  • 不要挂到 root
  • additivity=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
  • 慢接口日志
  • 高并发下日志优化实践