一,慢查询日志的介绍
MySQL数据库有一个“慢查询日志”功能,用来记录查询时间超过某个设定值的SQL,可以快速帮助我们找到需要优化的SQL位置。
二,慢查询日志开启
第一步,先通过指令查看一下自己的慢查询日志是否已经开启,如下:
slow_query_log 字段对应的value值为OFF,则表示慢查询日志为关闭状态。
slow_query_log_file 字段的value值代表的是MySQL数据库慢查询日志的存储路径,可不设置该参数,系统会自动给一个缺省文件。
查看慢查询的阈值
long_query_time 慢查询阈值,当查询时间多于设定的阈值时,记录日志,单位为秒
第二步 ,就是开启慢查询日志功能,一般分为临时开启和永久开启;
- 临时开启
指令:set global slow_query_log = ON;
指令:set global long_query_time = 10;
临时开启慢查询日志功能,设置查询时间超过10秒的语句记录日志,重启MySQL后失效。 - 永久开启
修改/etc/mysql/my.cnf配置,重启Mysql,永久生效。配置如下:
[mysqld]
slow_query_log = ON
slow_query_log_file= /var/log/mysql/slow.log
long_query_time = 10
第三步:慢查新日志的内容如何看
# Time: 2018-08-16T00:00:04.821003+08:00
# User@Host: zwfwroot[zwfwroot] @ 19.15.0.30 [19.15.0.30] Id: 67508
# Schema: gdqlk Last_errno: 0 Killed: 0
# Query_time: 14.344185 Lock_time: 0.000028 Rows_sent: 237064 Rows_examined: 237064 Rows_affected: 0
# Bytes_sent: 96078006
SET timestamp=1534348804;
SELECT * FROM `audit_catalog_lobby`;
如上是慢日志里其中一条SQL的记录内容,可以看到有时间戳,用户,查询时长及具体的SQL等,内容其实是很齐全的。但是存在一个问题,慢日志里往往有许多SQL,不可能一条一条SQL看过去,我们需要将所有的慢SQL分组统计后在进行分析。
- Query_time:sql执行的时间,越长则代表越慢
- Lock_time:mysql服务器阶段(不是在存储引擎阶段)等待表锁的时间
- Rows_sent:查询返回的行数
- Rows_examined:查询检查的行数
第四步:如何在慢查询日志中筛选特定的慢查询语句,有个mysqldumpslow命令可以在慢查询日志里筛选特定的慢查新语句。执行环境为:Linux下的shell下执行。
mysqldumpslow -s t -t 10 -g "select"/var/lib/mysql/conf-db-fat-slow.log
指令中的参数说明:
-s:表示按照何种方式排序
c:访问次数
l:锁定时间
r:返回记录
t:查询时间
al:平均锁定时间
ar:平均返回记录数
at:平均查询时间
-t:top n的意思,返回前面多少条数据
-g:后边可以写一个正则匹配模式,大小写不敏感的其他具体用法可以使用mysqldumpslow -h去学习。