2008年01月25日

Mysql的简单性能监控和调优

作者 非鱼

服务器上的Mysql已经跑了一年多,一直也没有关心过它的细节问题,不过有时候做数据导入的时候会发现Mysql会启动N多进程,而且有些频繁的Select会导致Mysql占用CPU和内存都很高。所以想到应该监控一下Mysql看看有没有什么性能问题,搜索了一下,找到一个简单的解决方案。

http://hackmysql.com/mysqlreport 这是一个Perl脚本,执行一下就会输出一些Mysql服务器运行状态的数据,这些数据比起mysqladmin的showstatus更直观,更有效。在服务器上安装了DBI和DBD::mysql以后脚本就可以用了。虽然运行的时候顶上会输出一堆Error信息,但是最后还是会显示正常的服务器信息。

http://hackmysql.com/mysqlreportguide 这里是对所输出的信息的完整的解释,每个参数的意义和重要性都可以看一下。对比我的服务器,一下子就发现了一个重要的问题。第16行的Slow是个非常重要的参数,是服务器运行过程中执行某些比较慢的查询的次数,最后一列是系统是否记录了slow query。这里的慢的定义是由Mysql的服务器参数long_query_time决定的,而这个值默认为10秒(相当长了),另外一个相关的参数是log_slow_queries,如果定义了该log的文件名,系统会将超过该时间的query记录下来,以便你的修正。

文章建议将long_query_time参数设为1,一个查询执行1秒钟已经是相当离谱的事情了,而且最好要尽量将这个出现次数控制到0,也就是排除掉一切执行慢的查询,因为这通常是由于程序本身原因引起的。而我的服务器输出的参数里,这个次数是7,虽然所占到的百分比是0,但是仍然说明系统里存在执行缓慢的语句,而且后面的是否记录日志又恰恰是OFF。于是改服务器上的my.cnf,加大了key buffer(原来是16M,使用了10M,加大到32M),加大了read buffer和query buffer,加上long_query_time=1和log_slow_queries参数。重启服务器。

很快就出现了一条slow的查询(可能是因为设成1的关系),打开日志一看,是个统计语句,用到了比较多的字段,同时又group by进行sum,而且更要命的是,条件里面两个字段没有索引。目前数据量还不大,先给这两个字段单独加上索引吧,以后再详细分析加联合索引。

看来以后要经常看看服务器这个命令了。