跳至主要內容

慢查询

chanchaw大约 1 分钟编程语言数据库mysql

概述

SpringBoot 项目中要记录 MySQL慢查询,一般常用的方式有两种,第一种通过MySQL本身的慢查询日志配置来进行记录,第二种是在Spring ` Boot应用中通过数据库连接池的日志功能来完成记录。下面我们就来详细介绍一下这两种方式。

MySQL本身的慢查询1/2

通常情况下,MySQL的配置文件是位于/etc/mysql/my.cnf或/etc/my.cnf中,然后需要开启慢查询的话可以通过如下的配置来实现

[mysqld]
slow_query_log = 1 # 开启慢查询
slow_query_log_file = /var/log/mysql/mysql-slow.log # 指定慢查询文件路径
long_query_time = 2 # 超过2秒视作慢查询
log_queries_not_using_indexes = 1 # 记录未使用索引的查询

修改配置文件后记得要重启 MySQL,可通过命令 cat /var/log/mysql/mysql-slow.log 查看慢查询日志

通过连接池查看慢查询2/2

SpringBoot 默认情况下使用 HikariCP 作为连接池,我们可以通过配置 HikariCP 的日志属性来记录慢查询操作,如下所示

spring:
  datasource:
    hikari:
      data-source-properties:
        logger: Slf4JLogger
        slowQueryThresholdMillis: 2000 # 超过2000毫秒视作慢查询

需要借助 P6Spy 拦截并记录慢查询,pom.xml 中添加依赖

<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>3.9.1</version>
</dependency>

然后在 src/main/resources/p6spy.properties 文件并添加以下内容,用来记录MySQL的慢查询操作。

modulelist=com.p6spy.engine.spy.P6SpyFactory
filter=true
logfile=spy.log
logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat
appender=com.p6spy.engine.spy.appender.Slf4JLogger
customLogMessageFormat=%(currentTime)|%(executionTime)|%(category)|connection%(connectionId)|%(sqlSingleLine)
executionThreshold=2000

然后需要在在SpringBoot的配置文件中添加P6Spy数据源的配置

spring:
  datasource:
    url: jdbc:p6spy:mysql://localhost:3306/yourdb
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver