我有一个奇怪的问题。我正在运行一个MySQL查询对一个非常大的表从PHP。查询时间超过一分钟,但这不是我的问题。看起来PHP每66秒重发一次查询。
show processlist;
+--------+---------+-------------------+----------+---------+------+---------------+--------------------------------------------------------
| Id | User | Host | db | Command | Time | State | Info
+--------+---------+-------------------+----------+---------+------+---------------+--------------------------------------------------------
| 150018 | root | localhost | amrs | Query | 32 | Sending data | /*DEREK*/select ctlno, count(*) AS count from (omitted)
几分钟后,我又检查了一次:
+--------+---------+-------------------+----------+---------+------+---------------+--------------------------------------------------------
| Id | User | Host | db | Command | Time | State | Info
+--------+---------+-------------------+----------+---------+------+---------------+--------------------------------------------------------
| 150018 | root | localhost | amrs | Query | 188 | Sending data | /*DEREK*/select ctlno, count(*) AS count from (omitted)
| 150021 | root | localhost | amrs | Query | 122 | Sending data | /*DEREK*/select ctlno, count(*) AS count from (omitted)
| 150023 | root | localhost | amrs | Query | 56 | Sending data | /*DEREK*/select ctlno, count(*) AS count from (omitted)
我没有重新加载页面或其他东西。Set_time_limit(0)在脚本开头附近被调用。令人讨厌的部分是,该页面似乎链接到最近运行的一个。因此,如果我杀死150018,不会发生什么不好的事情,但如果我在生成另一个150023之前杀死150023,页面就会出现"查询执行中断"错误。150018最终会自己完成运行,但它没有任何好处,因为脚本/页面不会接收它。
有人有什么想法吗?
EDIT: show full processlist给出以下内容(为了简洁和保密,删除了一些行):
+--------+---------+-------------------+----------+---------+-------+--------------+-----------------------------------------------------
| Id | User | Host | db | Command | Time | State | Info
+--------+---------+-------------------+----------+---------+-------+--------------+-----------------------------------------------------
| 147385 | root | localhost:44560 | amrs | Sleep | 14021 | | NULL
| 150248 | root | localhost | NULL | Query | 0 | NULL | show full processlist
| 150251 | root | localhost | amrs | Query | 1 | statistics | /*DEREK*/select ctlno, count(*) AS count from (snip)
+--------+---------+-------------------+----------+---------+-------+--------------+-----------------------------------------------------
我以前见过几次类似的问题,你的问题听起来和我以前在一个网站上遇到的问题非常相似。
你是通过代理服务器访问网站吗?
我的网站发生了什么,是来自同一公司内的一组特定用户的查询被定向到他们的代理服务器,这是决定自己,如果60秒内没有收到响应,那么它会再次发出web请求,而不通知客户端浏览器,这正在发生!
因此,对于某些长时间运行的查询,执行时间超过一分钟,我会看到查询开始相互复合,并且我最终会看到一个进程列表,其中运行着大量相同的查询,每个查询之间的间隔几乎正好是60秒!
解决方法是让客户端绕过代理服务器来访问我们的站点。
当客户端将代理服务器升级到最新版本时,这个完全相同的问题的第二个实例得到了解决。
我很抱歉,但是我不记得在这两种情况下使用的是什么代理服务器,因为这是几个月前的事了,从那以后我就睡了:-/