mysql开启慢查询日志

mysql可以在日志里记录下运行比较慢的sql语句,可以帮助sql语句的优化。这里用的是mysql5.1。

1、编辑my.cnf

vim /etc/my.cnf

2、在[mysqld]后添加:

long_query_time = 2
slow_query_log = 1
slow_query_log_file = /var/log/slow.log
log-queries-not-using-indexes

long_query_time:设置sql执行超过多长时间会被记录下来,单位秒。
slow_query_log:设为1开启慢查询日志,0关闭。
slow_query_log_file:设置日志名称位置。
log-queries-not-using-indexes:设置记录下没有使用索引的sql语句。

网上看到都是用log_slow_queries设置日志,但是在mysql5.1要使用slow_query_log和low_query_log_file:

As of MySQL 5.1.29, use –slow_query_log[={0|1}] to enable or disable the slow query log, and optionally –slow_query_log_file=file_name to specify a log file name. The –log-slow-queries option is deprecated.

具体可以看这里:
http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html

3、设置好后重启mysql

service mysqld restart

4、查看慢查询配置
在mysql命令行执行:

show variables like "%slow%";

+---------------------+-------------------+
| Variable_name       | Value             |
+---------------------+-------------------+
| log_slow_queries    | ON                |
| slow_launch_time    | 2                 |
| slow_query_log      | ON                |
| slow_query_log_file | /var/log/slow.log |
+---------------------+-------------------+
4 rows in set (0.00 sec)

5、建立slow.log
奇怪机器上的mysql不会自己建立slow.log文件?

cd /var/log
touch slow.log
chown mysql:mysql slow.log

再重启下mysql:

service mysqld restart

6、测试一下
在mysql命令行执行:

select sleep(3);
select sleep(2);

查看日志:

cat /var/log/slow.log

/usr/libexec/mysqld, Version: 5.1.52-log (Source distribution). started with:
Tcp port: 0  Unix socket: /var/lib/mysql/mysql.sock
Time                 Id Command    Argument
# Time: 120125  8:18:40
# User@Host: root[root] @ localhost []
# Query_time: 3.000524  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1327497520;
select sleep(3);
# Time: 120125  8:18:49
# User@Host: root[root] @ localhost []
# Query_time: 2.000430  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1327497529;
select sleep(2);

7、使用mysqldumpslow查看日志
mysqldumpslow是mysql自带的一个查看慢查询日志工具。

mysqldumpslow命令主要选项有:
-s ORDER:排序包括(al, at, ar, c, l, r, t),’at’是默认排序方法。
al: average lock time
ar: average rows sent
at: average query time
c: count
l: lock time
r: rows sent
t: query time
-r:反向排序(倒序)由小到大。
-t NUM:显示前n条记录。
-a:不把数字抽象显示为N,字符串抽象显示问S。
-g PATTERN:只查找包含该字符串的结果。

比如:
1)mysqldumpslow /var/log/slow.log

2)mysqldumpslow -s c -t 20 host-slow.log
查看访问次数最多的20个sql语句。

3)mysqldumpslow -s r -t 20 host-slow.log
查看返回记录行最多的20个sql语句。

4)mysqldumpslow -s t -t 10 -g “left join” host-slow.log
按照时间排序的前10条里面含有左连接的sql语句。

参考资料:
http://www.cnblogs.com/coser/archive/2011/11/08/2241674.html
http://www.cnblogs.com/wrmfw/archive/2011/09/05/2166929.html
http://www.daniel-journey.com/archives/93
http://hi.baidu.com/thinkinginlamp/blog/item/97acfc0319372e81d43f7ca9.html