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

Un indice composto con una seconda colonna di bassa cardinalità avrà un effetto sufficiente sulle prestazioni da poter essere utilizzato?

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à

  1. scopri che quell'indice è un possibile candidato
  2. controlla alcune statistiche, quindi
  3. 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 .