MySQL慢查询日志

MySQL慢查询日志

MySQL的慢查询日志是MySQL提供的一种日志记录,用来记录在MySQL中响应超过阈值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中

long_query_time默认值是10,运行超过10s的语句会被记录到慢查询日志中

如何使用

默认情况下,MySQL没有开启慢查询日志,需要我们手动开启. 如果不是调优需要的话,不建议开启该参数.因为慢查询日志或多或少会带来性能影响. 慢查询日志支持将日志记录到文件中

开启慢查询日志

SET GLOBAL slow_query_log = 1;
SHOW VARIABLES LIKE '%slow_query_log%';

image-20210511104600708

如果需要永久生效,需要修改my.cnf配置文件,在[mysqld]下增加参数配置,然后重启MySQL服务器

slow_query_log=1
slow_query_log_file=/path/to/log_file/my_slow.log
long_query_time=3

slow_query_log_file只想慢查询日志的存放路径,默认缺省的是host_name-slow.log

long_query_time表示慢查询SQL的阈值

修改long_query_time

慢查询的执行时间阈值由long_query_time来控制,默认是10秒

SHOW VARIABLES LIKE '%long_query_time%';
SET GLOBAL long_query_time = 3;

image-20210511104913884

设置了之后没有变化是因为需要重新连接或者新开一个会话才能看到修改值

image-20210511105323657

慢查询日志测试

SELECT sleep(4) FROM dual;

查看日志文件存放位置

image-20210511110417457

image-20210511110434523

image-20210511110233951

查看系统中有多少条慢查询记录

SHOW GLOBAL STATUS LIKE '%slow_queries%';

image-20210511110642674

日志分析工具mysqldumpslow

MySQL提供了日志分析工具mysqldumpslow可以很方便的查看MySQL生成的慢查询日志

mysqldumpslow --help 查看帮助

常见的参数

  • s 按什么方式排序
    • al: average lock time
    • ar: average row sent
    • at: average query time
    • c: count
    • l: lock time
    • r: rows time
    • t: query time
  • g: 搭配正则表达式 大小写不敏感

常见搭配

  • 获取返回记录集最多的10条SQL

    mysqldumpslow -s r -t 10 /path/to/my_slow.log

  • 得到访问次数最多的10条SQL

mysqldumpslow -s c -t 10 /path/to/my_slow.log

  • 按时间排序的前10条包含左连接的查询语句

    mysqldumpslow -s t -t 10 -g ‘left join’ /path/to/my_slow.log

  • 建立使用命令的时候配合 more查看,避免爆屏

    mysqldumpslow -s r -t 10 /path/to/my_slow.log | more


拓展使用Druid连接池获取慢SQL

一般开发中我们会整合druid作为数据库连接池,druid是一个非常强大的数据库连接工具,自带了SQL监控,SQL防火墙,SQL执行记录等功能,使用druid可以很方便的查看我们系统中所有存在的慢SQL,SQL调用统计等情况

  1. 添加pom文件

    
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.17</version>
    </dependency>
    
    
  2. 修改配置文件

    server:
      port: 9999
    
    spring:
      application:
        name: mysql-tutorial
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        username: root
        password: root
        url: jdbc:mysql://localhost:3306/tutorial?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia%2FShanghai&allowMultiQueries=true
        druid:
          # 开启的filter
          filters: wall,stat # 开启 防火墙和 state
          enable: true
          stat-view-servlet:
            enabled: true # 是否开启 web 页面监控平台 默认false
    #        loginUsername: admin # 开启监控 登录用户米密码
    #        login-password: 1
          filter:
            stat: # 监控相关配置
              slow-sql-millis: 3000 # 慢SQL时间阈值.
              merge-sql: true #  SQL合并配置 将相同SQL不同参数视为一条来进行统计 默认false
          web-stat-filter: # 基于web请求的监控
            enabled: true
            exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*' #需要排除的
            url-pattern: /* # 需要/*的形式底层是filter
    

    核心需要打开druid的filter功能,开始wall和stat的filter 一个用来做防火墙一个用来做统计

  3. 查看 /druid查看页面

    image-20210511143741663

  4. 查看SQL

    image-20210511143801946

  5. 可以点击页签上面的最慢按钮,倒序排列,找到有问题的SQL结合explain进行SQL的调优

更多的Druid的filter配置参考配置_StatFilter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值