mysql慢查询日志总结

摘要:
您可以直接cat相应的文件来查看mysql慢速查询日志,或者使用以下命令来查询tail-f实际日志路径。慢速查询主要反映在慢速查询中。一般来说,返回时间大于11秒的查询可以称为慢速查询。附加说明:1.在某些情况下,MySQL的缓慢查询记录可能无法达到目标。因此,很可能会出现奇怪的情况。很明显,查询确实很慢,但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

免责声明:文章转载自《mysql慢查询日志总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇决策树与规则引擎目标函数、损失函数、代价函数下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Mysql----mysql启动服务时提示"服务名无效"

1,首先说明一下我的环境,我刚开始是用的XAMPP这个集成的软件,里面安装了apache, mysql,tomcat这些软件,然后通过控制面板对其进行启动关闭的操作,这些操作很方便,但是我就用net start mysql,这时出现了“服务名无效” 问题原因:mysql服务没有安装。 解决办法: 在 mysql bin目录下 以管理员的权限 执行 mys...

MySQL日期数据类型、时间类型使用总结

MySQL 日期类型:日期格式、所占存储空间、日期范围 比较。 日期类型        存储空间       日期格式                 日期范围 ------------ ---------   --------------------- ----------------------------------------- datetime ...

MySQL 半同步复制+MMM架构

介绍上篇文章介绍了MMM架构的实现方法,但是上篇文章的MMM方案的复制是异步复制,异步复制的主要问题在于当主从存在延时时如果主机出现了故障导致了主从切换时这时将会存在数据丢失;mysql为了解决异步复制数据丢失的问题增加了半同步复制,半同步复制存在5.5以上的版本,半同步复制的原理是客户端在事务提交时必须等待从库接收到binlog的回应之后才能提交事务(...

使用logstash同步Mysql数据表到ES的一点感悟

针对单独一个数据表而言,大致可以分如下两种情况: 1.该数据表中有一个根据当前时间戳更新的字段,此时监控的是这个时间戳字段 具体可以看这个文章:https://www.cnblogs.com/sanduzxcvbnm/p/12858967.html 示例: modification_time就是表中要监控的时间戳字段 input { jdbc {...

mysql索引主键自增的测试

首先创建一张表 把主键设为自增,我们要测试这个主键到底是怎么自增这个id的 首先插入多条数据,id 不同, sql如下 INSERT INTO `hr`.`test` (`ad`) VALUES ('1'); INSERT INTO `hr`.`test` (`ad`) VALUES ('2'); INSERT INTO `hr`.`test` (`ad`...

(3.4)mysql基础深入——mysql.server启动脚本源码阅读与分析

(3.4)mysql基础深入——mysql.server启动脚本源码阅读与分析 my.server主要分为3大部分 【1】变量初始化部分  【2】函数声明部分  【3】具体执行部分 #!/bin/sh #【第1部分,变量初始化部分begin】 #【1.1】指定Mysql安装程序及数据目录的路径,默认是/usr/local/mysql,默认是空的 ba...