勿以恶小而为之,勿以善小而不为---- 刘备
有时候我们需要排查执行缓慢的SQL语句,这就用到了mysql慢查询日志。
开启慢查询日志的方式有两种:临时开启和永久开启。
开启慢查询日志功能可能需要mysql的版本达到5.7
查看版本号
select VERSION();
慢 SQL 开启前查询
看一下当前mysql数据库是否开启了慢查询
show variables like 'slow_query%';
查询 慢 SQL 的阈值 , 默认是 秒数。
show variables like 'long_query%';
- slow_query_log 慢查询开启状态,ON开启,OFF关闭
- slow_query_log_file 慢查询日志存放的位置
(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录) - long_query_time 查询超过多少秒才记录(才算是慢查询)
开启 慢 SQL
myql 在 linux 服务器默认的安装路径是: /var/lib/mysql
临时开启
set global slow_query_log_file='/var/lib/mysql/tmp_slow.log';
set global long_query_time=0.5;
set global log_output='FILE,TABLE'; //默认是FILE。如果也有TABLE,则同时输出到mysql库的slow_log表中。
set global slow_query_log='ON';
long_query_time设置后需要打开一个新的查询窗口(会话)才能看到新设置的值。
老的查询窗口还是显示之前的值,其实已经改了
永久开启
修改配置文件my.cnf,在[mysqld]下的下方加入
[mysqld]
slow_query_log = ON
# linux
slow_query_log_file = /var/lib/mysql/tmp_slow.log
long_query_time = 0.5
保存后,重启服务器
systemctl restart mysqld
慢日志分析
使用 mysqldumpslow 命令
mysqldumpslow能将相同的慢SQL归类,并统计出相同的SQL执行的次数,每次执行耗时多久、总耗时,每次返回的行数、总行数,以及客户端连接信息等.
mysqldumpslow语法说明:
-s ,按照什么方式起来排序。默认at,也就是按照平均查询时间来排序。都是按照倒序排列。
al: average lock time 平均锁定时间
ar: average rows sent 平均返回行数
at: average query time 平均查询时间
c: count 总执行次数
l: lock time 总锁定时间
r: rows sent 总返回行数
t: query time 总查询时间
-t ,show the top n queries,显示前多少名的记录
-a ,默认不开启这个选项。mysqldumpslow将相似的SQL的值(字符串或者数字)替换为N,开启该选项,则显示真实值。不开启该选项,有点类似于Oracle的绑定变量的记录。
-g ,类似于grep命令,过滤出需要的信息。如,只查询A表的慢查询记录。
-l ,总时间中包含锁定时间
按照查询时间进行展示
mysqldumpslow -s t slow.log
查询出前五条的记录
mysqldumpslow -t 10 -s t slow.log
[root@VM-0-2-centos lib]# mysqldumpslow -t 1 -s t slow.log
Reading mysql slow query log from slow.log
Count: 14585 Time=0.66s (9696s) Lock=0.00s (1s) Rows=0.0 (0), zkong[zkong]@[127.0.0.1]
select item0_.barCode as col_0_0_, item0_.type as col_1_0_, item0_.is_specs as col_2_0_ from item item0_ where item0_.merchant_id=N and (item0_.type=N or item0_.is_specs=N)
筛选记录信息,如某个表
mysqldumpslow -t 10 -s t -g "item" slow.log
默认不开启配置
mysqldumpslow -a -t 1 -s t slow.log
按照返回数查询
mysqldumpslow -a -t 2 -s ar slow.log
按照锁时间查询
mysqldumpslow -a -t 2 -s al slow.log
按照平均查询时间查询
mysqldumpslow -a -t 2 -s at slow.log