Mysql
 sql >> Database >  >> RDS >> Mysql

Perché MySQL è lento quando si utilizza LIMIT nella mia query?

Gli indici non migliorano necessariamente le prestazioni. Per capire meglio cosa sta succedendo, sarebbe utile includere il explain per le diverse query.

La mia ipotesi migliore sarebbe che tu abbia un indice in id_state o anche id_state, id_mp che può essere utilizzato per soddisfare il where clausola. In tal caso, la prima query senza order by userebbe questo indice. Dovrebbe essere abbastanza veloce. Anche senza un indice, ciò richiede una scansione sequenziale delle pagine negli orders tabella, che può essere comunque abbastanza veloce.

Quindi quando aggiungi l'indice su creation_date , MySQL decide di utilizzare quell'indice invece per order by . Ciò richiede la lettura di ogni riga nell'indice, quindi il recupero della pagina di dati corrispondente per controllare il where condizioni e restituire le colonne (se esiste una corrispondenza). Questa lettura è altamente inefficiente, perché non è in ordine di "pagina" ma piuttosto come specificato dall'indice. Le letture casuali possono essere piuttosto inefficienti.

Peggio, anche se hai un limit , devi ancora leggere l'intero tabella perché è necessario l'intero set di risultati. Sebbene tu abbia salvato un ordinamento su 38 record, hai creato una query estremamente inefficiente.

A proposito, questa situazione peggiora notevolmente se gli orders la tabella non rientra nella memoria disponibile. Quindi hai una condizione chiamata "thrashing", in cui ogni nuovo record tende a generare una nuova lettura di I/O. Quindi, se una pagina contiene 100 record, la pagina potrebbe dover essere letta 100 volte.

Puoi fare in modo che tutte queste query vengano eseguite più velocemente avendo un indice su orders(id_state, id_mp, creation_date) . Il where La clausola utilizzerà le prime due colonne e order by utilizzerà l'ultimo.