概念
Mysql记录所有执行时间超过(由long_query_time控制的)指定值的sql语句,慢查询日志就是记录这些sql语句的日志文件。
配置文件
Linux下是my.cnf文件,Windows下是my.ini文件,与存放数据的Data文件夹的路径一样。
Data文件夹路径:
mysql> show global variables like "%datadir%";
+---------------+---------------------------------------------+
| Variable_name | Value |
+---------------+---------------------------------------------+
| datadir | C:\ProgramData\MySQL\MySQL Server 5.7\Data\ |
+---------------+---------------------------------------------+
1 row in set, 1 warning (0.31 sec)
配置项
log-output -- 慢日志保存,取值包括:'FILE'(文件)、'TABLE'(表)、'FILE,TABLE'(文件和表都开启),默认值是'FILE'
slow-query-log -- 取值1/0,表示开启/停止慢日志查询
slow_query_log_file -- 慢日志文件路径,默认在Data文件下
long_query_time -- 慢日志阈值,以秒为单位,默认为10
log_queries_not_using_indexes -- 是否将未使用索引的sql记录到慢日志文件中
修改配置项
1)、直接打开my.ini,新增/修改配置项的值,然后需要重启服务,永久生效
改成如下所示(超过0.05秒的sql记录下来),并删除原来的日志文件(DESKTOP-PS154P1-slow.log)
2)、也可以直接修改配置项,比如下面修改long_query_time的值,需要重启打开一个窗口(会话)才会生效,但是部分配置项(eg:慢日志文件路径)直接修改并不会生效,所以不建议直接;
show variables like '%配置项%'; -- 查看配置项信息, 完全匹配可以不加%
set global 配置项 = 值; -- 重新设置值
测试(制造点假数据,模拟下慢日志被记录下来的情况)
1)、删除索引
2、复制数据
表user_oper_record是记录user的操作记录,由触发器完成,感兴趣的可以看下【简单了解Mysql中的触发器】
执行下面两行命令
select * from user u, user_oper_record r where u.phone = r.phone;
select count(*) from user u, user_oper_record r where u.phone = r.phone;
可以发现生成了su-slow.log文件,且第一条命令执行了0.11S(>0.05S),被记录了下来,第二条命令执行0.03S(<0.03S),没有被记录下来。
mysqldumpslow工具
当项目足够大,慢日志足够多时(这里设置long_query_time = 0,记录所有sql),分析日记会非常费时费力。MySQL提供了日志分析工具mysqldumpslow帮助我们快速查询到想要查询的慢日志。
mysqldumpslow的使用需要【安装ActivePerl】
安装完
perl mysqldumpslow.pl --help -- 查看相关命令
其中值得注意点的命令是
-s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default
al: average lock time -- 平均锁的时间
ar: average rows sent -- 平均数据数
at: average query time -- 平均查询时间
c: count -- 总次数
l: lock time -- 锁的时间
r: rows sent -- 数据总数
t: query time -- 查询时间
完整命令,将su-slow.log文件复制到了桌面
perl mysqldumpslow.pl -s t -t 记录数 日志路径 -- -t 记录数 : 取记录的数量
如果有写的不对的地方,请大家多多批评指正,非常感谢!