mysql慢查询日志对于跟踪有问题的查询非常有用,可以分析出当前程序里有很耗费资源的sql语句,这是一个有用的日志。它对于性能的影响不大(假设所有查询都很快),并且强调了那些最需要注意的查询(丢失了索引或索引没有得到最佳应用),那如何打开mysql的慢查询日志记录呢?
首先在开启之前得确定下当前mysql是否已经开启了慢日志查询,我们可以在登录了mysql命令行下输入命令:
show variables like "%slow%";
将出现如下结果:
+---------------------+--------------------------------------------+
| Variable_name | Value |
+---------------------+--------------------------------------------+
| log_slow_queries | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /home/hh.hhsy.cc-slow.log |
+---------------------+--------------------------------------------+
下面对上面查询结果做一下说明:
long_query_time : 设定慢查询的阀值,超出次设定值的SQL即被记录到慢查询日志,缺省值为10s
slow_query_log : 指定是否开启慢查询日志
log_slow_queries : 指定是否开启慢查询日志(该参数要被slow_query_log取代,做兼容性保留)
slow_query_log_file :指定慢日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log
long-slow-admin-statements :记录那些慢的optimize table,analyze table和alter table语句
log-slow-Slave-statements :记录由Slave所产生的慢查询
主要看 slow_query_log 这一行的结果,如果为ON表示开启,OFF表示关闭,如上本人的是关闭的。
(1)配置开启
Linux:
在mysql配置文件 my.cnf 中找到[mysqld]标签,在该标签下增加如下语句(#开头的行是注释):
log-slow-queries=/home/hh.hhsy.cc-slow.log
#指定日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log
long_query_time=5 #记录超过的时间,默认为10s,这里设置为查询时间超过5s的查询语句
log-queries-not-using-indexes = on # 列出没有使用索引的查询语句
#log-queries-not-using-indexes 是否记录所有没有使用索引的query,可以根据情况决定是否开启
#log-long-format 是否记录所有的查询记录,包括没有使用索引的查询
注意:自mysql 5起,设置慢查询日志的相关参数做了修改,下面有记述。
Windows:
在 my.ini 的[mysqld]添加如下语句(语句选项以及释义同上):
log-slow-queries = E:\log\php.hhsy.cc\mysql_slow_query.log
long_query_time = 5
本人在linux环境下修改完毕重启mysqld的过程中,一直启动失败,提示:
Starting MySQL.. ERROR! The server quit without updating PID file ......
这样的错误,网上搜了半天,发现自mysql 5起,设置慢查询日志的相关参数做了修改,新的参数如下:
slow-query-log=1 #开启慢查询
slow-query-log_file = /home/hh.hhsy.cc-slow.log #慢查询日志目录
long_query_time = 1 #记录下查询时间超过1秒
以上的做法需要重启mysql服务器,也可以不重启修改慢查询配置:
set global.slow_query_log=1
set global.slow_query_time=3
其他参数可通过以下命令查阅: show variables '%slow%';
还有一些其他的相关配置参数,这里也一并说明下:
#记录所有sql语句
log=E:/mysqllog/mysql.log
#记录数据库启动关闭信息,以及运行过程中产生的错误信息
log-error=E:/mysqllog/myerror.log
# 记录除select语句之外的所有sql语句到日志中,可以用来恢复数据文件
log-bin=E:/mysqllog/bin
另外也可以直接通过在mysql命令行的方式下设置相关参数,具体操作过程如下:
mysql> show variables like "%long%"; //查看一下默认为慢查询的时间10秒
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
mysql> set global long_query_time=2; //设置成2秒,加上global,下次进mysql已然生效
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like "%slow%"; //查看一下慢查询是不是已经开启
+---------------------+---------------------------------+
| Variable_name | Value |
+---------------------+---------------------------------+
| log_slow_queries | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /usr/local/mysql/mysql-slow.log |
+---------------------+---------------------------------+
4 rows in set (0.00 sec)
mysql> set slow_query_log='ON'; //加上global,不然会报错的。
ERROR 1229 (HY000): Variable 'slow_query_log' is a GLOBAL variable and should be set with SET GLOBAL
mysql> set global slow_query_log='ON'; //启用慢查询
Query OK, 0 rows affected (0.28 sec)
mysql> show variables like "%slow%"; //查看是否已经开启
+---------------------+---------------------------------+
| Variable_name | Value |
+---------------------+---------------------------------+
| log_slow_queries | ON |
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | /usr/local/mysql/mysql-slow.log |
+---------------------+---------------------------------+
4 rows in set (0.00 sec)
(2)查看方式
Linux:
使用mysql自带命令mysqldumpslow查看
常用命令
-s ORDER what to sort by (t, at, l, al, r, ar etc), 'at’ is default
-t NUM just show the top n queries
-g PATTERN grep: only consider stmts that include this string
eg:
s,是order的顺序,说明写的不够详细,俺用下来,包括看了代码,主要有 c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒序
-t,是top n的意思,即为返回前面多少条的数据
-g,后边可以写一个正则匹配模式,大小写不敏感的
具体命令使用如下:
mysqldumpslow -s c -t 20 host-slow.log
mysqldumpslow -s r -t 20 host-slow.log
上述命令可以看出访问次数最多的20个sql语句和返回记录集最多的20个sql。
mysqldumpslow -t 10 -s t -g “left join” host-slow.log这个是按照时间返回前10条里面含有左连接的sql语句。
Windows:
当你是第一次开启mysql的慢查询,会在你指定的目录下创建这个记录文件,本文就是mysqlslowquery.log,这个文件的内容大致如下(第一次开启MYSQL慢查询的情况下)
E:\web\mysql\bin\mysqld, Version: 5.4.3-beta-community-log (MySQL Community Server (GPL)). started with:
TCP Port: 3306, Named Pipe: (null)
Time Id Command Argument
可以通过如下的命令来查看慢查询的记录数:
mysql> show global status like '%slow%';
结果如下:
+---------------------+-------+
| Variable_name | Value |
+---------------------+-------+
| Slow_launch_threads | 0 |
| Slow_queries | 0 |
+---------------------+-------+