导入了2W产品到Zen Cart中后,服务器性能一下子差的不可忍受,跑进去一看,NND内存被吃完了,再通过top命令查看,原来是Apache和Mysql两兄弟在捣乱,一个个吃饱撑的东倒西歪的。开始以为是这俩哥没有配置好,调整了下配置文件,没有效果,于是目标就转移到Zen Cart中了。

Web程序慢,首先的一个检测对象就是数据库,写过几年程序的都知道。现在想追踪MySQL中那些拖累服务器性能的SQL语句,怎么办?需要开启一个慢查询输出的一个机关:log_slow_queries。可以在MySQL配置文件中(my.ini/my.cnf)中设置,也可以通过MySQL客户端临时设置。第二种方法的好处是,可以不用重启MySQL服务,而使设置生效。那就来试试这个:

首先通过客户端连接到Mysql服务器,然后输入下面的语句:

SET GLOBAL log_slow_queries = ON;
SET GLOBAL long_query_time = 3;

这样MySQL就会把耗时>=3秒的SQL语句给记录下来,并输出到一个慢查询日志文件中。问题来了,这个慢查询日志文件在什么地方呢?如下,在MYSQL客户端中执行下面的语句:

show variables like 'slow_query_log_file';

就会看到MySQL慢查询日志文件位置。我的是:/usr/local/mysql/data/host-slow.log

查看这个日志文件,找到一个奇怪的SQL语句,每次请求页面的时候,无论是首页/产品页/类别页,该语句都把所有的产品信息select出来,真是变态!之前因为产品少,所以打开页面速度还可以接受,由于一下子导入了2w产品,每次请求页面都把整个表给select放在内存中,怪不得内存一下子就给塞满了,服务器慢的不可忍受。最后找到Zen Cart中调用该变态SQL语句的代码,注释掉,服务器又畅快的跑起来了!