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

MySQL interrompe l'utilizzo di index quando vengono aggiunti ulteriori vincoli

È un po' difficile da spiegare.

La query che utilizza l'indice lo sta utilizzando perché l'indice è un indice di "copertura". Cioè, tutte le colonne nell'indice sono nella query. L'unica parte dell'indice effettivamente utilizzata è la condizione su latitude .

Normalmente un indice di copertura dovrebbe avere solo le colonne menzionate nella query. Tuttavia, la chiave primaria viene utilizzata per fare riferimento ai record, quindi suppongo che users.Id è la chiave primaria sul tavolo. E l'indice viene scansionato per valori validi di latitude .

La query che non utilizza l'indice non lo utilizza per due motivi. Innanzitutto, le condizioni sulle colonne sono le disuguaglianze. Una ricerca dell'indice può utilizzare solo condizioni di uguaglianza e una disuguaglianza. Ciò significa che l'indice può essere utilizzato solo per latitude nel suo metodo più efficace. In secondo luogo, le colonne aggiuntive nella query richiedono comunque di accedere alla pagina dei dati.

In altre parole, l'ottimizzatore sta dicendo:"Perché preoccuparsi di andare all'indice per scansionare l'indice e quindi scansionare le pagine di dati? Invece, posso semplicemente scansionare le pagine di dati e ottenere tutto in una volta".

La tua prossima domanda è senza dubbio:"Ma come faccio a rendere la mia query più veloce?" Il mio suggerimento sarebbe di indagare sugli indici spaziali .