mysql如何捕捉慢日志查询


慢日志查询日志


mysql如何捕捉慢日志查询


查询超过变量 long_query_time指定时间值的为慢查询,但是查询获取锁(包括锁等待)的时间不计入查询时间内,mysql 记录慢查询日志是在查询执行完毕且已经完全释放锁之后才记录,因为慢查询日志的记录顺序和执行sql的顺序可能不一致,注意 mysql5.1之后就支持微秒级的慢查询,对于dba而言一个查询0.5秒和运行0.05秒是非常不同的,前者可能索引使用错误或者走了表扫描,后者索引使用正确。

另外,指定的慢查询超时时长,只有超过了它才是慢查询,等于是不记录的。

和慢查询有关的变量

long_query_time=10 默认10秒

log_output={table|file|none} 默认是file

slow_query_log={1|on|0|off} 这个也是是否启用慢日志, slow_query_log_file=/mydata/data/hostname-slow.log 默认路径下主机名 加上-slow.log

log_queries_not_using_indexes=OFF 查询没有使用索引的时候是否也记入慢查询日志


现在启用慢查询日志:

set @@global.slow_query_log=on;

我们来进行一个测试

select sleep(10);select * from ceshi;

mysql如何捕捉慢日志查询

我们有两个语句 现在慢日志只记录了第一个 select sleep(10) 这个记录。

随着时间推移,慢查询会越来越多,这多分析非常困难,好在提供了一个慢查询工具 mysqldumpslow


[root@xuexi data]# mysqldumpslow --help

-d debug

-v verbose:显示详细信息

-t NUM just show the top n queries:仅显示前n条查询

-a don't abstract all numbers to N and strings to 'S':归类时不要使用N替换数字,S替换字符串

-g PATTERN grep: only consider stmts that include this string:通过grep来筛选select语句。

该工具归类的时候,默认会将同文本但变量值不同的查询语句视为同一类,并使用N代替其中的数值变量,使用S代替其中的字符串变量。可以使用-a来禁用这种替换。如:

[root@xuexi data]# mysqldumpslow xuexi-slow.log


Reading mysql slow query log from xuexi-slow.log Count: 1 Time=10.00s (10s) Lock=0.00s (0s) Rows=1.0 (1), root[root]@localhost select sleep(N) [root@xuexi data]# mysqldumpslow -a xuexi-slow.log Reading mysql slow query log from xuexi-slow.log Count: 1 Time=10.00s (10s) Lock=0.00s (0s) Rows=1.0 (1), root[root]@localhost select sleep(10)

显然,这里归类后的结果只是精确到0.01秒的,如果想要显示及其精确的秒数,则使用-d选项启用调试功能。

[root@xuexi data]# mysqldumpslow -d xuexi-slow.log


Reading mysql slow query log from xuexi-slow.log [[/usr/local/mysql/bin/mysqld, Version: 5.6.35-log (MySQL Community Server (GPL)). started with: Tcp port: 3306 Unix socket: /mydata/data/mysql.sock Time Id Command Argument # Time: 170329 9:55:58 # User@Host: root[root] @ localhost [] Id: 1 # Query_time: 10.000847 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0 use test; SET timestamp=1490752558; select sleep(10); ]] <<>> <<# Time: 170329 9:55:58 # User@Host: root[root] @ localhost [] Id: 1 # Query_time: 10.000847 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0 use test; SET timestamp=1490752558; select sleep(10); >> at /usr/local/mysql/bin/mysqldumpslow line 97, <> chunk 1. [[# Time: 170329 9:55:58 # User@Host: root[root] @ localhost [] Id: 1 # Query_time: 10.000847 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0 use test; SET timestamp=1490752558; select sleep(10); ]] {{ select sleep(N)}} Count: 1 Time=10.00s (10s) Lock=0.00s (0s) Rows=1.0 (1), root[root]@localhost select sleep(N)

慢查询在SQL语句调优的时候非常有用,应该将它启用起来,且应该让慢查询阈值尽量小,例如1秒甚至低于1秒。就像一天执行上千次的1秒语句,和一天执行几次的20秒语句,显然更值得去优化这个1秒的语句。

您可能还会对下面的文章感兴趣: