SpringBoot - MyBatis-Plus使用详解18(结合P6Spy进行SQL性能分析)
P6Spy 是一个可以用来在应用程序中拦截和修改数据操作语句的开源框架。 通过 P6Spy 我们可以对 SQL 语句进行拦截,相当于一个 SQL 语句的记录器,这样我们可以用它来作相关的分析,比如性能分析。
注意:该插件有性能损耗,建议平时开发测试时使用,不建议生产环境使用。
十八、结合 P6Spy 进行 SQL 性能分析
1,安装配置
(1)首先编辑项目的 pom.xml 文件,加入 p6spy 依赖:
<dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>3.9.0</version> </dependency>
(2)接着编辑 application.properties 文件,更换数据库连接驱动:
P6Spy 工作原理:P6Spy 通过劫持 JDBC 驱动,在调用实际 JDBC 驱动前拦截调用的目标语,达到 SQL 语句日志记录的目的。
spring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.url=jdbc:p6spy:mysql://localhost:3306/hangge2?serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=hangge1234

(3)最后创建 spy.properties 配置文件即可:
#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2
2,开始测试
(1)我们使用 Mybatis-Plus 执行一个简单的查询操作:List<UserInfo> users = userInfoMapper.selectList(null); System.out.println(users);
(2)可以看到控制台会显示对应 SQL 的执行时间:

附:进阶技巧
1,使用日志系统记录 sql
(1)上面的样例配置,我们是直接将日志输出到控制台,我们可以修改 appender 配置属性,使用日志系统记录 sql:

(2)再次执行查询,可以看到现在改用日志系统记录 sql 了:

2,将日志输出到文件
我们也可以修改 appender 配置属性,将日志输出到文件中:
#日志输出到文件
appender=com.p6spy.engine.spy.appender.FileLogger
# 指定 Log 的文件名 默认 spy.log
#logfile=spy.log
# 指定是否每次是增加 Log,设置为 false 则每次都会先进行清空 默认true
#append=true

3,自定义日志格式
(1)如果觉得默认的日志格式不合适,我们也可以使用 logMessageFormat 和 customLogMessageFormat 这两个配置参数来自定义日志输出格式:
(2)再次执行查询,可以看到已经变成了我们自定义的格式了:
可用的变量为:
- %(connectionId):connection id
- %(currentTime):当前时间
- %(executionTime):执行耗时
- %(category):执行分组
- %(effectiveSql):提交的 SQL 换行
- %(effectiveSqlSingleLine):提交的 SQL 不换行显示
- %(sql):执行的真实 SQL 语句,已替换占位
- %(sqlSingleLine):执行的真实 SQL 语句,已替换占位不换行显示
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat customLogMessageFormat=%(currentTime) | SQL耗时: %(executionTime) ms | 连接信息: %(category)-%(connectionId) | 执行语句: %(sql)
(2)再次执行查询,可以看到已经变成了我们自定义的格式了:
