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