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

DO e DONT per gli indici

In generale:

1. Non aggiungere un indice a meno che non sia effettivamente necessario.

Ogni indice rende le scritture più lente...

2. Verrà utilizzato un indice sulle clausole where:

-- index on foo (bar)
select bar from foo where bar = :bar;

Allo stesso modo verrà utilizzato nei riferimenti a chiavi esterne (su entrambe le tabelle).

-- index on foo (bar) if baz (bar) is frequently updated/deleted.
create table foo (bar references baz (bar)); 

3. Verrà utilizzato un indice per l'ordinamento, soprattutto se legato a un limite:

-- index on foo (bar)
select bar from foo order by bar limit 10;

4. Gli indici a più colonne sono occasionalmente utili quando si applicano entrambi 2. e 3.

In questo caso metti prima le condizioni where e per ultima la chiave di ordinamento:

-- index on foo (baz, bar)
select bar from foo where baz between :baz1 and :baz2 group by bar;

5. Tieni aggiornate le statistiche della tua tabella.

Se le statistiche della tabella sono spazzatura, ci sono poche possibilità che l'ottimizzatore utilizzi i tuoi indici. Aspira/analizza manualmente il database, se necessario.

6. L'utilizzo dell'indice dipende dalla ripartizione della tabella.

Oltre una certa soglia di righe recuperate, sarà più veloce eseguire un'analisi completa della tabella. Se il tuo indice si trova su un campo booleano che divide più o meno in due la tua tabella, non verrà mai utilizzato.

Allo stesso modo, se i tuoi dati sono archiviati in modo tale che la scansione dell'indice finirà probabilmente per accedere casualmente a quasi tutte le pagine del disco applicabili per quella tabella, il pianificatore preferirà una scansione completa della tabella.

7. Considera gli indici parziali/di espressione quando disponibili.

Se hai un campo che ha lo stesso valore tranne che per il 10% delle tue righe, considera un indice parziale su di esso (cioè dove non quel valore). Ciò si traduce in un indice molto più piccolo senza ostacolarne l'effettiva utilità.

Se esegui costantemente query su un'espressione applicata alla tua colonna e la tua piattaforma offre indici di espressioni, prendi in considerazione l'aggiunta di un indice su di essa. Se utilizzata, l'espressione non verrà valutata per ogni riga.