Il rapporto EXPLAIN è noto per essere difficile da interpretare. Hanno sovraccaricato troppe informazioni in pochi campi. Potresti provare
Il type: index
indica che sta eseguendo una scansione dell'indice , il che significa che sta visitando ogni voce nell'indice.
In questo modo viene visualizzato lo stesso numero di voci di una scansione tabella, tranne per il fatto che si trova su un indice secondario anziché sull'indice cluster (primario).
Quando vediamo type: index
, EXPLAIN mostra possible_keys: NULL
il che significa che non può utilizzare alcun indice per la ricerca in modo efficiente. Ma mostra anche key: add_time
il che significa che l'indice che sta usando per la scansione dell'indice è add_time
.
La scansione dell'indice è dovuta al fatto che MySQL non è in grado di ottimizzare le espressioni o le chiamate di funzioni da solo. Ad esempio, se dovessi provare a cercare date con un mese specifico, potresti cercare month(add_time) = 4
ma ciò non userebbe l'indice su add_time perché le date con quel mese sono sparse nell'indice, non tutte raggruppate insieme.
Potresti sapere che date(add_time)
dovrebbe poter essere cercato dall'indice, ma MySQL non fa questa inferenza. MySQL vede solo che stai usando una funzione e non prova nemmeno a usare l'indice.
Ecco perché MySQL 5.7 ha introdotto colonne generate per consentirci di indicizzare un'espressione e MySQL 8.0 l'ha resa ancora migliore consentendo un indice da definire per un'espressione senza richiederci di definire prima una colonna generata.