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 .