MySQL慢查询日志总结

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> MySQL慢查询日志总结

作者:潇湘隐者
链接:www.cnblogs.com/kerrycode

慢查询日志概念

MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过longquerytime值的SQL,则会被记录到慢查询日志中。longquerytime的默认值为10,意思是运行10S以上的语句。

默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。

官方文档,关于慢查询的日志介绍如下(部分资料,具体参考官方相关链接):

The slow query log consists of SQL statements that took more than longquerytime seconds to execute and required at least minexaminedrowlimit rows to be examined. The minimum and default values of longquerytime are 0 and 10, respectively. The value can be specified to a resolution of microseconds.
 
For logging to a file, times are written including the microseconds part. For logging to tables, only integer times are written; the microseconds part is ignored.
 
By default, administrative statements are not logged, nor are queries that do not use indexes for lookups. This behavior can be changed usinglogslowadminstatements and logqueriesnotusingindexes, as described later.

慢查询日志相关参数

MySQL 慢查询的相关参数解释:

  • slowquerylog :是否开启慢查询日志,1表示开启,0表示关闭。
  • log-slow-queries :旧版(5.6以下版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
  • slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
  • longquerytime :慢查询阈值,当查询时间多于设定的阈值时,记录日志。
  • logqueriesnotusingindexes:未使用索引的查询也被记录到慢查询日志中(可选项)。
  • logoutput:日志存储方式。logoutput=’FILE’表示将日志存入文件,默认值是’FILE’。logoutput=’TABLE’表示将日志存入数据库,这样日志信息就会被写入到mysql.slowlog表中。MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output=’FILE,TABLE’。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到文件。

慢查询日志配置

默认情况下slowquerylog的值为OFF,表示慢查询日志是禁用的,可以通过设置slowquerylog的值来开启,如下所示:

12345678910111213141516171819202122
mysql show variables  like '%slow_query_log%';+---------------------+-----------------------------------------------+| Variable_name       | Value                                         |+---------------------+-----------------------------------------------+| slow_query_log      | OFF                                           || slow_query_log_file | /home/WDPM/MysqlData/mysql/DB-Server-slow.log |+---------------------+-----------------------------------------------+2 rows in set (0.00 sec) mysql set global slow_query_log=1;Query OK, 0 rows affected (0.09 sec) mysql show variables like '%slow_query_log%';+---------------------+-----------------------------------------------+| Variable_name       | Value                                         |+---------------------+-----------------------------------------------+| slow_query_log      | ON                                            || slow_query_log_file | /home/WDPM/MysqlData/mysql/DB-Server-slow.log |+---------------------+-----------------------------------------------+2 rows in set (0.00 sec) mysql

mysql show variables  like ‘%slow_query_log%’;
+———————+———————————————–+
| Variable_name       | Value                                         |
+———————+———————————————–+
| slow_query_log      | OFF                                           |
| slow_query_log_file | /home/WDPM/MysqlData/mysql/DB-Server-slow.log |
+———————+———————————————–+
2 rows in set (0.00 sec)

mysql set global slow_query_log=1;
Query OK, 0 rows affected (0.09 sec)

mysql show variables like ‘%slow_query_log%’;
+———————+———————————————–+
| Variable_name       | Value                                         |
+———————+———————————————–+
| slow_query_log      | ON                                            |
| slow_query_log_file | /home/WDPM/MysqlData/mysql/DB-Server-slow.log |
+———————+———————————————–+
2 rows in set (0.00 sec)

mysql

使用set global slowquerylog=1开启了慢查询日志只对当前数据库生效,如果MySQL重启后则会失效。如果要永久生效,就必须修改配置文件my.cnf(其它系统变量也是如此)。例如如下所示:

12345678910
mysql show variables like 'slow_query%';+---------------------+-----------------------------------------------+| Variable_name       | Value                                         |+---------------------+-----------------------------------------------+| slow_query_log      | OFF                                           || slow_query_log_file | /home/WDPM/MysqlData/mysql/DB-Server-slow.log |+---------------------+-----------------------------------------------+2 rows in set (0.01 sec) mysql

mysql show variables like ‘slow_query%’;
+———————+———————————————–+
| Variable_name       | Value                                         |
+———————+———————————————–+
| slow_query_log      | OFF                                           |
| slow_query_log_file | /home/WDPM/MysqlData/mysql/DB-Server-slow.log |
+———————+———————————————–+
2 rows in set (0.01 sec)

mysql

修改my.cnf文件,增加或修改参数slowquerylog 和slowquerylog_file后,然后重启MySQL服务器,如下所示

slowquerylog =1

slowquerylogfile=/tmp/mysqlslow.log

MySQL慢查询日志总结
12345678910
mysql show variables like 'slow_query%';+---------------------+---------------------+| Variable_name       | Value               |+---------------------+---------------------+| slow_query_log      | ON                  || slow_query_log_file | /tmp/mysql_slow.log |+---------------------+---------------------+2 rows in set (0.00 sec) mysql

mysql show variables like ‘slow_query%’;
+———————+———————+
| Variable_name | Value |
+———————+———————+
| slow_query_log | ON |
| slow_query_log_file | /tmp/mysql_slow.log |
+———————+———————+
2 rows in set (0.00 sec)

mysql

关于慢查询的参数slowquerylogfile ,它指定慢查询日志文件的存放路径,系统默认会给一个缺省的文件hostname-slow.log(如果没有指定参数slowquerylog_file的话)

1234567
mysql show variables like 'slow_query_log_file';+---------------------+-----------------------------------------------+| Variable_name       | Value                                         |+---------------------+-----------------------------------------------+| slow_query_log_file | /home/WDPM/MysqlData/mysql/DB-Server-slow.log |+---------------------+-----------------------------------------------+1 row in set (0.00 sec)

mysql show variables like ‘slow_query_log_file’;
+———————+———————————————–+
| Variable_name | Value |
+———————+———————————————–+
| slow_query_log_file | /home/WDPM/MysqlData/mysql/DB-Server-slow.log |
+———————+———————————————–+
1 row in set (0.00 sec)

那么开启了慢查询日志后,什么样的SQL才会记录到慢查询日志里面呢? 这个是由参数longquerytime控制,默认情况下longquerytime的值为10秒,可以使用命令修改,也可以在my.cnf参数里面修改。关于运行时间正好等于longquerytime的情况,并不会被记录下来。

也就是说,在mysql源码里是判断大于longquerytime,而非大于等于。从MySQL 5.1开始,longquerytime开始以微秒记录SQL语句运行时间,之前仅用秒为单位记录。如果记录到表里面,只会记录整数部分,不会记录微秒部分。

123456789101112131415161718
mysql show variables like 'long_query_time%';+-----------------+-----------+| Variable_name   | Value     |+-----------------+-----------+| long_query_time | 10.000000 |+-----------------+-----------+1 row in set (0.00 sec) mysql set global long_query_time=4;Query OK, 0 rows affected (0.00 sec) mysql show variables like 'long_query_time';+-----------------+-----------+| Variable_name   | Value     |+-----------------+-----------+| long_query_time | 10.000000 |+-----------------+-----------+1 row in set (0.00 sec)

mysql show variables like ‘long_query_time%’;
+—————–+———–+
| Variable_name | Value |
+—————–+———–+
| long_query_time | 10.000000 |
+—————–+———–+
1 row in set (0.00 sec)

mysql set global long_query_time=4;
Query OK, 0 rows affected (0.00 sec)

mysql show variables like ‘long_query_time’;
+—————–+———–+
| Variable_name | Value |
+—————–+———–+
| long_query_time | 10.000000 |
+—————–+———–+
1 row in set (0.00 sec)

如上所示,我修改了变量longquerytime,但是查询变量longquerytime的值还是10,难道没有修改到呢?

注意:使用命令 set global longquerytime=4修改后,需要重新连接或新开一个会话才能看到修改值。你用show variables like ‘longquerytime’查看是当前会话的变量值,你也可以不用重新连接会话,而是用show global variables like ‘longquerytime’; 如下所示:

MySQL慢查询日志总结

在MySQL里面执行下面SQL语句,然后我们去检查对应的慢查询日志,就会发现类似下面这样的信息。

1234567891011121314151617181920
mysql select sleep(3);+----------+| sleep(3) |+----------+|        0 |+----------+1 row in set (3.00 sec) [root@DB-Server ~]# more /tmp/mysql_slow.log/usr/sbin/mysqld, Version: 5.6.20-enterprise-commercial-advanced-log (MySQL Enterprise Server - Advanced Edition (Commercial)). started with:Tcp port: 0  Unix socket: (null)Time                 Id Command    Argument/usr/sbin/mysqld, Version: 5.6.20-enterprise-commercial-advanced-log (MySQL Enterprise Server - Advanced Edition (Commercial)). started with:Tcp port: 0  Unix socket: (null)Time                 Id Command    Argument# Time: 160616 17:24:35# User@Host: root[root] @ localhost []  Id:     5# Query_time: 3.002615  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0SET timestamp=1466069075;select sleep(3);

mysql select sleep(3);
+———-+
| sleep(3) |
+———-+
| 0 |
+———-+
1 row in set (3.00 sec)

[root@DB-Server ~]# more /tmp/mysql_slow.log
/usr/sbin/mysqld, Version: 5.6.20-enterprise-commercial-advanced-log (MySQL Enterprise Server - Advanced Edition (Commercial)). started with:
Tcp port: 0 Unix socket: (null)
Time Id Command Argument
/usr/sbin/mysqld, Version: 5.6.20-enterprise-commercial-advanced-log (MySQL Enterprise Server - Advanced Edition (Commercial)). started with:
Tcp port: 0 Unix socket: (null)
Time Id Command Argument

Time: 160616 17:24:35

User@Host: root[root] @ localhost [] Id: 5

Query_time: 3.002615 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0

SET timestamp=1466069075;
select sleep(3);

MySQL慢查询日志总结

logoutput 参数是指定日志的存储方式。logoutput=’FILE’表示将日志存入文件,默认值是’FILE’。logoutput=’TABLE’表示将日志存入数据库,这样日志信息就会被写入到mysql.slowlog表中。

MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output=’FILE,TABLE’。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到文件。

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> MySQL慢查询日志总结


 上一篇
一文了解InnoDB存储引擎 一文了解InnoDB存储引擎
从Mysql5.5版本开始,InnoDB是默认的表存储引擎。其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读、同时被设计用来最有效的利用以及使用内存和CPU。 本文主要内容: InnoDB体系架构 CheckPoint技术
下一篇 
MySQL数据库开发常见问题及几点优化! MySQL数据库开发常见问题及几点优化!
来源:www.cnblogs.com/cyfonly/p/5616536.html MySQL数据库是被广泛应用的关系型数据库,其体积小、支持多处理器、开源并免费的特性使其在Internet中小型网站中的使用率尤其高。在使用 MySQL的过