MySQL打开slow log只要在配置项添加
log-long-format
log-slow-queries = /data/dbdata/slow-query.log
long_query_time = 1
就可以在slow-query.log文件中看到所有执行时间超过1秒或者没有用到索引的查询语句,一般的格式如下:
# Time: 091109 22:02:14
# User@Host: root[root] @ [172.16.219.15]
#Query_time: 3Lock_time: 0 Rows_sent: 0 Rows_examined: 0
SET timestamp=1257775334;
insert into DS_Calc_Innodb_38.t_calc_30000 (PolicyID,sspkey,value,strvalue,updatetime,updatestate ,seqnum) values(30010,'79495341',0
,'0',Now(),2,'');
根据这个日志我们可以看到,这个insert语句执行时间为3秒,有具体的执行时间、IP、SQL语句,对分析性能问题非常有帮助。
可惜最小的slow时间是1秒,而最近遇到的问题是有比较多的几百毫秒的超时,这个slow log就无能为力了,在印象中MySQL有个micro slow patch,于是google之,果不出所料,在MySQL performance的blog上看到有相关介绍,详见http://www.MySQLperformanceblog.com/2006/10/01/backport-of-micro-time-patch-to-MySQL-41/
于是直接弄下来打上补丁,果然很好用。具体实施方法如下:
1、找到相应版本的补丁,如我的MySQL是4.1.16版本的,下载相应的patch,这个是4.1.21的patch,在4.1.16上一样适用
2、找到4.1.16的源码,如我的目录是/home/quency/MySQL-4.1.16,进到相应的目录,把patch文件拷进来,执行:patch –p1 < patch.slow-micro.4.1.21.diff;提示补丁打成功,注意有无错误提示
3、重新编译MySQL并安装,执行:./configure –prefix=/usr/local/MySQL;make;make install
4、修改配置设置long_query_time = 100000 (这个是以微秒为单位的,此处设置100ms)
5、启动MySQL,查看是否生效how variables like ‘long_query_time’
MySQL> show variables like 'long_query_time';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 0.100000 |
+-----------------+----------+
1 row in set (0.00 sec)
搞定!slow log里记录类似如下日志:
# Time: 091112 9:03:43 # User@Host: root[root] @ [172.16.219.15]
#Query_time: 0.350958Lock_time: 0.000020 Rows_sent: 0 Rows_examined: 0
insert into DS_Calc_Innodb_22.t_calc_30000 (PolicyID,sspkey,value,strvalue,updatetime,updatestate ,seqnum) values(30006,'1256145936|
MP200910260001',0,'0',Now(),2,'');
可以看到以上sql语句执行时间为350毫秒。