Il costo del mantenimento di un indice (a colonna singola oa più colonne) è quasi sempre controbilanciato dal miglioramento delle prestazioni quando viene utilizzato quell'indice. È un piccolo incremento su ogni INSERT
/DELETE
, più un costo se si modifica il valore di un campo indicizzato tramite UPDATE
. (Il UPDATE
caso è raro.) Quindi, non preoccuparti del costo del "mantenere un indice composto".
WHERE `vehicles`.`type` IN ('Car')
AND `vehicles`.`user_id` = 10
necessita di INDEX(user_id, type)
.
L'ottimizzatore lo farà
- scopri che quell'indice è un possibile candidato
- controlla alcune statistiche, quindi
- o usa l'indice o decidi che la cardinalità è scarsa e scansiona semplicemente la tabella.
Includere l'indice; non preoccuparti.
Ho ordinato i campi in questo modo, non (type, user_id)
in base al tuo IN
, il che implica che a volte potresti avere più valori per type
.
Se tutte le righe della tabella hanno type = 'Car'
, nessun problema. Tutto ciò che ho detto è ancora valido. Lo spreco di includere il type
non necessario è insignificante.
È meglio avere tutte le "=" colonna(e) prima in un indice, quindi al massimo un altro campo. Ulteriori discussioni qui .