mysql慢查询日志总结

查看慢查询是否开启:

mysql>show variables like '%slow_query_log%';

Variable_name       Value

slow_query_log       on

slow_query_log_file  日志路径

显示为on,已开启,并且下面写出了日志文件的路径。
直接cat对应文件即可查看mysql慢查询日志或者通过以下命令查询

tail -f 实际日志路径

慢查询主要体现在慢上,通常意义上来讲,只要返回时间大于 >1 sec上的查询都可以称为慢查询。慢查询会导致CPU,内存消耗过高。数据库服务器压力陡然过大,那么大部分情况来讲,肯定是由某些慢查询导致的。

查看慢查询设置时间,默认是10秒,可以设置

mysql>show variables like '%long_query_time%';

Variable_name       Value

long_query_time     1.000000

查看慢查询日志中多少sql超过1秒

mysql>SHOW GLOBAL STATUS LIKE '%Slow_queries%'; 

Variable_name       Value

Slow_queries         21640

如何开启慢查询功能
方法一:在服务器上找到mysql的配置文件my.cnf , 然后在[mysqld]里追加一下内容,这样会一直生效,需要重启mysql服务。

vim my.cnf
[mysqld]
slow_query_log = ON
#定义慢查询日志的路径
slow_query_log_file = 以实际日志路径为准
#定义查过多少秒的查询算是慢查询,这里定义的是1秒,5.6版本之后允许设置少于1秒,例如0.1秒
long_query_time = 1
#用来设置是否记录没有使用索引的查询到慢查询记录,默认关闭,看需求开启,会产生很多日志,可动态修改
#log-queries-not-using-indexes
管理指令也会被记录到慢查询。比如OPTIMEZE TABLE, ALTER TABLE,默认关闭,看需求开启,会产生很多日志,可动态修改
#log-slow-admin-statements

方法二:动态设置,不需要重启mysql,不过重启后会失效

#开启慢查询功能,1是开启,0是关闭
mysql> set global slow_query_log=1;
#定义查过多少秒的查询算是慢查询,这里定义的是1秒,5.6版本之后允许设置少于1秒,例如0.1秒
mysql> set global long_query_time=1;
#定义慢查询日志的路径
mysql> set global slow_query_log_file='日志文件路径';
#关闭功能:
set global slow_query_log=0;
#设置慢查询记录到表中
set global log_output='TABLE';

慢查询日志记录内容定义,通过命令查看:tail -f 日志文件路径

# Time: 110107 16:22:11
# User@Host: root[root] @ localhost []
# Query_time: 9.869362 Lock_time: 0.000035 Rows_sent: 1 Rows_examined: 6261774
SET timestamp=1294388531;
select count(*) from user;

第一行:SQL查询执行的时间

第二行:执行SQL查询的连接信息,用户和连接IP

第三行:记录了一些比较有用的信息,如下解析:
- Query_time,这条SQL执行的时间,越长则越慢
- Lock_time,在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间
- Rows_sent,查询返回的行数
- Rows_examined,查询检查的行数,越长就越费时间
第四行:设置时间戳,没有实际意义,只是和第一行对应执行时间。
第五行及后面所有行(第二个# Time:之前),执行的sql语句记录信息,因为sql可能会很长

慢查询日志记录分析方法

日志记录可能有很多条,需要做统计分析。

方法一:使用mysql程序自带的mysqldumpslow命令分析

例如:mysqldumpslow -s c -t 10 日志文件路径

这会输出记录次数最多的10条SQL语句,得出的结果和上面一般慢查询记录的格式没什么区别。

参数解析:
-s:是表示按照何种方式排序,子参数如下:
    c、t、l、r:分别是按照记录次数、时间、查询时间、返回的记录数来排序,
    ac、at、al、ar:表示相应的倒叙;
-t:返回前面多少条的数据,这里意思就是返回10条数据了(也可以说是前十)
-g:后边可以写一个正则匹配模式,大小写不敏感的,比如:
    /path/mysqldumpslow -s r -t 10 日志文件路径,得到返回记录集最多的10个查询。
    /path/mysqldumpslow -s t -t 10 -g "left join" 日志文件路径,得到按照时间排序的前10条里面含有左连接的查询语句。

方法二:使用pt(Percona Toolkit)工具的pt-query-digest进行统计分析。
这个是由Percona公司出品的一个用perl编写的脚本,只有安装上pt工具集才会存在,有兴趣的朋友就要先安装pt工具了。直接分析慢查询文件,执行如下:

pt-query-digest 日志文件路径 >t.txt

因为记录里还是可能有很多sql在,看起来还是费劲,所以建议输出到文件来看。

额外说明:

1、个别情况下,mysql慢查询记录可能达不到目的。

那是因为mysql的慢查询记录机制导致,因为mysql只是把在引擎阶段的慢查询记录到慢日志,其他例如网络延迟(如:跨机房),IO传输延时(如:读写频繁),客户端延迟(如:jdbc高负载),还有个别内部资源锁等待,可能导致增加的查询延时,但又不一定记录在慢日志的。

所以很可能就出现一种诡异的情况,明明查询确实很慢,但是mysql的慢日志就是没有记录下来。这个时候就要我们的思路更广阔一些了。

2、如果慢查询日志还是解决不了问题的话,就建议开查询日志general-log来跟踪sql了。
大体和上面操作差不多,先查看当前状态
show variables like 'general%';
可以在my.cnf里添加
general-log = 1开启(0关闭)
log = /log/mysql_query.log路径
也可以设置变量那样更改
set global general_log=1开启(0关闭)

参考资料:https://blog.csdn.net/Mr_lisj/article/details/93867681

原文地址:https://www.cnblogs.com/lirun/p/14954638.html