2011-10-13 11 views
8

私は奇妙な問題があります。私はPHPの非常に大きなテーブルに対してMySQLクエリを実行しています。クエリ時間は1分以上ですが、それは私の問題ではありません。 PHPが66秒ごとにクエリを再送信しているようです。MySQLクエリは60秒ごとに再起動しますか?

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を殺すと、そのページには「クエリ実行中断」というエラーが発生します。 150018は最終的には単独で実行を終了しますが、スクリプト/ページはそれを受信しないため、何もしません。

誰もが考えている?

EDIT:フル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) 
+--------+---------+-------------------+----------+---------+-------+--------------+----------------------------------------------------- 
+0

あなたは私たちを見ることができますこのコマンドの結果: 'show full proceslist;'はクエリを実行した直後ですか? (開いている2つの接続、#1 =あなたのクエリ、#2 =このクエリ) –

+0

それは私が期待するように見えます。私は上記のように、他のクエリに関連するいくつかの行を省略しましたが、私は上にそれを付け加えました。 – Derek

+0

テーブル構造を表示できますか? where節はありませんか? –

答えて

1

私は数回前に同様の問題を見てきましたし、あなたの問題は、どのような私に非常に似て聞こえます以前のウェブサイトで作業していました。

ウェブサイトにアクセスするときにプロキシサーバーを経由していますか?

私のサイトで起こったことは、同じ会社内の特定のユーザーからのクエリがプロキシサーバーを経由して誘導されたことで、60秒以内に応答がなかった場合、クライアントブラウザにこれが起こっていることを知らさずに、Webリクエストを再度発行するだけです!

実行に1分以上かかる特定の長時間実行されるクエリでは、私はお互いに複合化を開始することがわかります。そして、同じクエリが実行されているプロセスリストを見て、それぞれがほぼ正確に60秒で区切られています!

この解決方法は、クライアントが私たちのサイトのプロキシサーバーをバイパスするようにすることでした。

クライアントがプロキシサーバーを最新バージョンにアップグレードしたときに、この同じ問題の2番目のインスタンスが解決されました。

申し訳ありませんが、私はそれがかなりの数ヶ月前だったので、プロキシサーバは、いずれの場合も使用されていたものを思い出すことができない、と私はそれ以来、眠っている: -/

+1

あなたが言っているのは、古いクエリの1つを殺しても応答がない(プロキシサーバーがそのページをあきらめて移動したため)、あなたが単一の(または最近の? )クエリを実行すると、プロキシサーバーが待機している唯一のブラウザであるため、ブラウザで応答が表示されます。 –

+0

イカだったと思います。あなたはとにかく、前の私のボスだといいね! –

+0

それは間に合っているかもしれませんが、わかりません。残念ながら、クライアントのサイトにあるプロキシは、私たちがそれをほとんど制御できないことを意味していました。そして、私は非常にうまくやっている、あなたとあなたの良い女性があまりにも願って! :) –

関連する問題