[TOC]
# 简介
默认情况,mysql没有开启慢查询日志,需要手动来开启.
查询是否开启
~~~
show variables like '%slow_query_log%';
~~~
开启下
修改my.cnf文件,增加或修改参数`slow_query_log` 和`slow_query_log_file`后,然后重启MySQL服务器,如下所示
~~~
slow_query_log =1
slow_query_log_file=/tmp/mysql_slow.log
~~~
关于慢查询的参数`slow_query_log_file` ,它指定慢查询日志文件的存放路径,系统默认会给一个缺省的文件`host_name-slow.log`(如果没有指定参数`slow_query_log_file`的话)
---
~~~
select sleep(3);
~~~
那么开启了慢查询日志后,什么样的SQL才会记录到慢查询日志里面呢? 这个是由参数`long_query_time`控制,默认情况下`long_query_time`的值为10秒,可以使用命令修改,也可以在my.cnf参数里面修改。关于运行时间正好等于`long_query_time`的情况,并不会被记录下来。也就是说,在mysql源码里是判断大于`long_query_time`,而非大于等于。从MySQL 5.1开始,`long_query_time`开始以微秒记录SQL语句运行时间,之前仅用秒为单位记录。如果记录到表里面,只会记录整数部分,不会记录微秒部分。
---
系统变量`log-queries-not-using-indexes`:未使用索引的查询也被记录到慢查询日志中(可选项)。如果调优的话,建议开启这个选项。另外,开启了这个参数,其实使用`full index scan`的sql也会被记录到慢查询日志。
~~~
mysql> show variables like 'log_queries_not_using_indexes';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF |
+-------------------------------+-------+
1 row in set (0.00 sec)
mysql> set global log_queries_not_using_indexes=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'log_queries_not_using_indexes';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | ON |
+-------------------------------+-------+
1 row in set (0.00 sec)
~~~
系统变量`log_slow_admin_statements`表示是否将慢管理语句例如`ANALYZE TABLE`和`ALTER TABLE`等记入慢查询日志
~~~
mysql> show variables like 'log_slow_admin_statements';
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| log_slow_admin_statements | OFF |
+---------------------------+-------+
1 row in set (0.00 sec)
~~~
查询有多少条慢查询记录,可以使用系统变量。
~~~
mysql> show global status like '%Slow_queries%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries | 2104 |
+---------------+-------+
1 row in set (0.00 sec)
~~~
# mysql配置
在`[mysqld]`下配置
~~~
slow_query_log =1
slow_query_log_file=/tmp/mysql_slow.log
long_query_time=3
log_output=FILE
~~~
`log_output`参数是指定日志的存储方式。`log_output='FILE'`表示将日志存入文件,默认值是'FILE'。
`log_output='TABLE'`表示将日志存入数据库,这样日志信息就会被写入到`mysql.slow_log`表中。MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:`log_output='FILE,TABLE'`。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到文件。
# 日志分析工具
~~~
mysqldumpslow [参数] [日志文件]
~~~
**参数**
~~~
s: 是表示按照何种方式排序
c: 访问计数
l: 锁定时间
r: 返回记录
t: 查询时间
al:平均锁定时间
ar:平均返回记录数
at:平均查询时间
t: 是top n的意思,即为返回前面多少条的数据
g: 后边可以写一个正则匹配模式,大小写不敏感的
~~~
**例子**
得到返回记录集最多的10个SQL
~~~
mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log
~~~
得到访问次数最多的10个SQL
~~~
mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log
~~~
得到按照时间排序的前10条里面含有左连接的查询语句
~~~
mysqldumpslow -s t -t 10 -g “left join” /database/mysql/mysql06_slow.log
~~~
另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现刷屏的情况
~~~
mysqldumpslow -s r -t 20 /mysqldata/mysql/mysql06-slow.log | more
~~~