源本科技 | 码上会

SQL 分析与打印

2026/04/03
2
0

引言

在开发和调试过程中,查看完整、可直接执行的 SQL 是定位问题、优化性能最关键的环节。MyBatis-Plus 原生日志仅输出带占位符的 SQL,而集成 p6spy 组件后,可自动打印完整可执行 SQL统计执行耗时监控慢查询,极大提升开发效率


p6spy

什么是 p6spy

p6spy 是一款基于 JDBC 驱动代理的 SQL 监控工具,它无缝拦截应用与数据库之间的 JDBC 调用,无侵入式打印真实可执行 SQL,并统计执行耗时。

核心优势

日志方式

输出内容

可读性

耗时统计

MyBatis 原生日志

select * from user where id=?

差(需手动拼接参数)

p6spy 日志

select * from user where id=1

极佳(可直接复制执行)

有(精确到毫秒)

核心能力

  • 打印完整可执行 SQL(自动替换占位符)

  • 统计SQL 执行耗时

  • 慢 SQL 监控告警

  • 自定义日志格式与输出方式

  • 支持过滤指定表 / 指定类型的 SQL

  • 兼容所有 JDBC 规范的数据库(MySQL、PostgreSQL、Oracle 等)


Spring Boot 集成

<dependency>
    <groupId>com.github.gavlyukovskiy</groupId>
    <artifactId>p6spy-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>
decorator:
  datasource:
    p6spy:
      # 自定义日志格式(耗时 || SQL)
      log-format: "\n Execution Time: %(executionTime) ms || SQL: %(sql)\n"
      # 开启慢 SQL 日志
      slow-sql:
        enable: true
        # 慢 SQL 阈值(毫秒)
        threshold: 2000
        # 慢 SQL 日志级别
        log-level: warn

效果展示

启动项目后,控制台直接输出可执行 SQL + 耗时

# 原生日志(无法直接使用)
Preparing: select * from user where id = ?
Parameters: 1(Long)

# p6spy 日志(直接复制到数据库运行)
Execution Time: 12 ms || SQL: select * from user where id = 1

常见问题

SQL 打印为 null

excludecategories 中增加 commit

excludecategories=info,debug,result,resultset,commit

批量操作不打印 SQL

移除 excludecategories 中的 batch

# 错误(包含 batch)
excludecategories=info,debug,batch

# 正确(不包含 batch)
excludecategories=info,debug,result

批量操作 SQL 重复打印

使用 MyBatis-Plus 提供的 MybatisPlusLogFactory(3.2.1+ 支持),已在标准配置中默认配置。

日志输出乱码

指定控制台编码,或在启动参数添加:

-Dfile.encoding=UTF-8

最佳实践

生产环境使用建议

  • 开发 / 测试环境:推荐开启,方便调试与优化

  • 生产环境建议关闭,p6spy 会带来轻微性能损耗

  • 生产监控优先使用:SkyWalking、Pinpoint、Prometheus 等专业 APM 工具

最佳实践

  • 慢 SQL 阈值设置为 2 秒,及时发现性能瓶颈

  • 过滤日志表、临时表,减少无用输出

  • 结合 MP 分页插件,优化慢查询 SQL


总结

  1. p6spy 是 MyBatis-Plus 开发必备工具,解决原生日志无法查看完整 SQL 的痛点

  2. 两种集成方式:标准配置(灵活)starter 配置(简洁)

  3. 核心配置只需修改:驱动类 + URL 前缀 + 日志格式

  4. 支持慢 SQL 监控SQL 过滤自定义格式

  5. 开发环境强烈推荐,生产环境谨慎开启