2011-10-13 15 views
8

Ho uno strano problema. Sto eseguendo una query MySQL su un tavolo molto grande da PHP. Il tempo di interrogazione è più di un minuto, ma non è un mio problema. Sembra che PHP stia rinviando la query ogni 66 secondi.Query MySQL riavviata ogni 60 secondi?

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) 

Pochi minuti dopo, ho controllato di nuovo:

+--------+---------+-------------------+----------+---------+------+---------------+-------------------------------------------------------- 
| 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) 

non ho ricaricato la pagina o niente. set_time_limit (0) viene chiamato vicino all'inizio dello script. La parte fastidiosa è che la pagina sembra essere collegata alla più recente corsa. Quindi se uccido 150018, non succede niente di male, ma se uccido 150023 prima che venga generato un altro, la pagina genera un errore di "Esecuzione della query interrotta". 150018 finirà per funzionare da solo, ma non serve a niente perché lo script/pagina non lo riceverà.

Qualcuno ha qualche idea?

EDIT: spettacolo ricco processlist ha pronunciato la seguente (con alcune linee rimosse per brevità e la riservatezza):

+--------+---------+-------------------+----------+---------+-------+--------------+----------------------------------------------------- 
| 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

si può mostrarci il risultato di questo comando: 'show full proceslist;' subito dopo aver eseguito la query? (aprire 2 connessioni, # 1 = la query, # 2 = questa query) –

+0

Sembra lo stesso di quanto mi aspetterei. Ho omesso alcune righe relative ad altre query, come ho fatto in precedenza, ma l'ho aggiunto sopra. – Derek

+0

puoi mostrare la struttura della tabella? non c'è una clausola dove? –

risposta

1

ho visto un problema simile un paio di volte prima, e vostri problemi suono molto simile a quello che ho stava vivendo lavorando con un sito web precedente.

Stai andando attraverso un server proxy quando si va al sito web?

Che cosa stava succedendo con il mio sito, era che le query di un particolare gruppo di utenti all'interno della stessa azienda venivano indirizzate attraverso il loro server proxy, che stava decidendo per sé che se non si riceveva risposta entro 60 secondi, allora emetterebbe nuovamente la richiesta web, senza informare il browser del client che ciò stava accadendo!

Quindi, con alcune query di lunga durata che richiedono più di un minuto per l'esecuzione, vedrei che le query iniziano a complicarsi l'una sull'altra, e finirò guardando un elenco di processi con un sacco di query identiche in esecuzione, ognuno separato da quasi esattamente 60 secondi!

La risoluzione a questo è stato quello di ottenere il client per by-passare il loro server proxy per il nostro sito.

Una seconda istanza di questo esattamente lo stesso problema è stato risolto quando il client aggiornato i loro server proxy per la versione più recente.

Mi dispiace, ma non riesco a ricordare ciò che server proxy era in uso in entrambi i casi, come è stato un bel paio di mesi fa, e ho dormito da allora: -/

+1

E qualcosa che dici conferma i miei sospetti, nel senso che se si uccide una delle query più vecchie non si vede alcuna risposta (dato che il server proxy ha rinunciato a quella pagina e si è spostato) e se si uccide il singolo (o il più recente?) query, quindi si vede la risposta nel browser, in quanto quello è l'unico che il server proxy è in attesa di ... –

+0

Penso che fosse Squid. Spero che tu stia bene, ex mio capo! –

+0

Potrebbe essere stato, ma non sono sicuro. Sfortunatamente, il proxy sul sito dei clienti significava che avevamo un controllo limitato su di esso. E sto facendo molto bene, spero anche tu e la tua buona signora! :) –

Problemi correlati