Una delle mie query su MySQL 5.0.45 è in esecuzione lenta nella fase di "invio dei dati". La query è una semplice selezione, restituisce circa 300 campi ID interi come set di risultati.MySql - fase di invio lento dei dati
mysql> SELECT source_id FROM directions WHERE (destination_id = 10); +-----------+ | source_id | +-----------+ | 2 | | 8 | ... | 2563 | +-----------+ 341 rows in set (2.13 sec)
Sono notare sicuro perché è "l'invio dei dati" fase così lento e cosa si può fare per rendere più veloce. Si noti che sto eseguendo questa query sul prompt di MySQL sul server stesso, quindi non mi aspetto davvero che passi così tanto tempo in "invio di dati". Qualche indizio?
Se aiuta, ho 3 campi di testo su questo tavolo, ma dal momento che non vengono selezionati, mi aspetto che non sono causa di questa lentezza.
Questa query viene eseguita migliaia di volte al giorno e non può davvero permettersi di spendere 2 secondi su di esso di volta in volta.
risultato Profiling:
mysql> show profile for query 4; +--------------------------------+----------+ | Status | Duration | +--------------------------------+----------+ | (initialization) | 0.000003 | | checking query cache for query | 0.000051 | | checking permissions | 0.000007 | | Opening tables | 0.000011 | | System lock | 0.000005 | | Table lock | 0.000023 | | init | 0.00002 | | optimizing | 0.00001 | | statistics | 0.00006 | | preparing | 0.000014 | | executing | 0.000005 | | Sending data | 2.127019 | | end | 0.000015 | | query end | 0.000004 | | storing result in query cache | 0.000039 | | freeing items | 0.000011 | | closing tables | 0.000007 | | logging slow query | 0.000047 | +--------------------------------+----------+ 18 rows in set (0.00 sec)
UPDATE: ho inciampato sul seguente URL che dice
Each time means the time elapsed between the previous event and the new event. So, the line: | Sending data | 0.00016800 | means that 0.00016800 seconds elapsed between "executing" and "Sending data". It is, it takes 0.00016800 seconds to execute the query.
http://forums.mysql.com/read.php?24,241461,242012#msg-242012
Qualcuno può convalidare?
L'affermazione non è vera sulla pagina collegata. Se esegui una 'SHOW PROCESSLIST' mentre la query è in esecuzione, mostrerà che la query è effettivamente nello stato ** Invio di dati **. (Non nel precedente). - E per favore nessuno dica che la lista dei processi mostra il passaggio * successivo * nell'esecuzione. :) – vbence
@vbence: hai mai visto una query che richiede più di pochi utenti per l'esecuzione? La teoria di cui sopra ha un senso. –
@ user9111337 Oh si. Le istruzioni aggregate (GROUP BY) con la clausola WHERE di solito generano selezioni che non possono essere risolte usando un indice (EXPLAIN ... dirà "USANDO DOVE") - se la tabella è abbastanza grande, ciò può richiedere diversi minuti. - Come viene segnalato? Puoi vederlo da solo provando l'opzione 'SHOW PROCESSLIST'. – vbence