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%';
如果需要永久生效,需要修改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;
设置了之后没有变化是因为需要重新连接或者新开一个会话才能看到修改值
慢查询日志测试
SELECT sleep(4) FROM dual;
查看日志文件存放位置
查看系统中有多少条慢查询记录
SHOW GLOBAL STATUS LIKE '%slow_queries%';
日志分析工具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调用统计等情况
-
添加pom文件
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.17</version> </dependency>
-
修改配置文件
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 一个用来做防火墙一个用来做统计
-
查看 /druid查看页面
-
查看SQL
-
可以点击页签上面的最慢按钮,倒序排列,找到有问题的SQL结合explain进行SQL的调优
更多的Druid的filter配置参考配置_StatFilter