2010-02-19 16 views
7

Ultimamente sto ottenendo che MySQL si blocchi su query specifiche. Ho una tabella con oltre 500.000 record. Ecco la query in esecuzione:I risultati di ordinamento di MySQL impiegano molto tempo

SELECT * FROM WHERE items (itemlist_id = 115626) ORDER BY tableOrder DESC LIMIT 1

Ecco l'spiegare:

| 1 | SEMPLICE | articoli | TUTTI | NULL | NULL | NULL | NULL | 587113 | Usando dove; Usando filesort |

E qui è l'entrata process_list:

| 252996 | radice | localhost | itemdb | Query | 0 | Risultato dell'ordinamento | SELECT * FROM items WHERE (itemlist_id = 115642) ORDER BY tableOrder LIMITE DEL DESCRIZIONE 1 |

Qualche idea su quale potrebbe essere il motivo per cui questa query impiega 10 minuti per l'elaborazione? Quando lo eseguo manualmente è fatto rapidamente. (1 row in set (0.86 sec))

Grazie

+1

Sei sicuro che l'ordinamento sia lento e non trovi il record? Se hai una scansione tabella di 500k + record su un campo che non è indicizzato, potrebbe richiedere del tempo. E la velocità "manuale" potrebbe essere dovuta al fatto che MySQL (o il sistema operativo) ha memorizzato nella cache i dati di un tentativo precedente e lo esegue molto più velocemente. –

risposta

6

È necessario creare un indice su items (itemList_id, TableOrder) e riscrivere la query un po:

SELECT * 
FROM items 
WHERE itemlist_id = 115626 
ORDER BY 
     itemlist_id DESC, tableOrder DESC 
LIMIT 1 

La prima condizione in ORDER BY possono sembrare ridondante, ma aiuta MySQL a scegliere il piano corretto (che non ordina).

+0

Grazie! Ho aggiunto l'indice e la query, e ora è incredibilmente veloce. –

+0

potresti per favore fornire una risorsa per la modifica apportata alla query. è molto importante capire perché per me. – TDSii

+1

@TDSii: Ho eseguito la modifica in base ai documenti 'MySQL' e alla mia esperienza. – Quassnoi

Problemi correlati