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.