2010-02-03 11 views
24

Sto creando un nuovo DB e mi chiedevo se ci fosse qualche svantaggio nell'aggiungere numerosi indici alle tabelle che penso possano richiedere uno.C'è uno svantaggio nell'aggiungere numerosi indici alle tabelle?

Se creo un indice ma alla fine non lo utilizzo causerà problemi?

+4

Duplicate: http://stackoverflow.com/questions/141232/how-many-database-indexes-is-too-many, http://stackoverflow.com/questions/418744/what -è-il-costo-di-indicizzazione-multiple-db-colonne e molti altri. –

+0

Non ho mai visto una domanda con così tante risposte doppie in meno di un minuto. –

+0

Penso che questo sia sempre più probabile che accada man mano che SO diventa sempre più popolare, specialmente sulle domande facili/generiche come questa. –

risposta

27

Gli indici rendono più veloce la ricerca nelle tabelle, ma più lungo in cui scrivere. Gli indici inutilizzati finiranno per causare un rallentamento non necessario.

+2

Anche gli indici occupano spazio su disco. –

16

ogni indice:

  • prende qualche luogo, su disco, e in RAM
  • richiede un po 'di tempo per aggiornare, ogni volta che si inserisce/aggiornamento/eliminare una riga

Il che significa dovresti solo definire gli indici che sono utili per le esigenze della tua applicazione: troppi indici rallenteranno le scritture più di quanto guadagnerai dalle letture.

1

Avere un indice significa che INSERT e UPDATE richiedono più tempo. Se hai troppi indici, il vantaggio di tempi di ricerca più veloci può non valere la pena di inserire il tempo di INSERT e UPDATE in più.

5

Sì. Dovresti aggiungere solo quegli indici, che sono necessari.

Un indice richiede spazio aggiuntivo e, quando si inseriscono/aggiornano/eliminano record, il DBMS deve aggiornare anche tali indici. Quindi, questo significa che ci vuole più tempo per aggiornare/aggiungere/eliminare un record, dal momento che il DBMS deve fare un po 'di amministrazione extra.

aggiungendo numerosi indici alle tabelle che penso possa richiedere uno.

È necessario aggiungere solo quegli indici per i quali si è certi che siano necessari. per determinare le colonne dove si poteva mettere indici, si potrebbe:

  • aggiungere indici a colonne che sono chiavi esterne
  • aggiungono gli indici per le colonne che sono spesso utilizzati nelle clausole WHERE
  • aggiungere indici a colonne che vengono utilizzate in ordine di clausole.

Un altro -e forse approccio meglio-, è quello di utilizzare SQL Profiler:

  • uso di SQL Profiler per tracciare il vostro applicazione/database per un po '
  • salvare la traccia risulta
  • uso la traccia ha come risultato l'ottimizzazione guidata dell'indice, che ti indicherà quali indici dovresti creare, quali colonne dovrebbero essere in ogni indice e ti dirà anche l'ordine di tali colonne per l'indice.
1

Sì; avere un indice rende le selezioni più veloci ma potenzialmente rende gli inserimenti più lenti, poiché gli indici devono essere aggiornati per ogni inserto. Se la tua applicazione fa molta scrittura e non ha molta lettura (ad esempio un registro di controllo), devi evitare di indicizzare ulteriormente.

4

Gli indici provocano un aumento delle dimensioni del database e il tempo necessario per inserire/aggiornare/eliminare record. Cerca di non aggiungerli se non sai che li userai.

1
  • aggiornamento e il costo di inserimento più come indici devono essere aggiornati così
  • più spazio utilizzato
1

Non creare indici aggiuntivi agli inizi. Aspetta di aver almeno parzialmente sviluppato il sistema in modo da avere un'idea sull'utilizzo del tavolo. Generare piani di query per vedere cosa viene interrogato (e come, e i costi delle prestazioni) e POI aggiungere nuovi indici secondo necessità.

1

Non indicizzare ciecamente! Dai un'occhiata ai tuoi dati per vedere quali colonne sono effettivamente utilizzate nei predicati SELECT e indicizzale.

Considerare anche che gli indici abbiano spazio. A volte un sacco di spazio. Ho visto database in cui i dati di indicizzazione superano di gran lunga i dati grezzi nel volume puro.

1

Spazio extra, tempo extra per inserire come tutti hanno detto.

Inoltre, dovresti essere certo dei tuoi indici e del tuo design perché a volte gli indici possono rallentare le query se l'ottimizzatore di query sceglie l'indice sbagliato. Questo è raro ma può accadere se ottimizzando un indice per un particolare join e facendo in modo che un altro join diventi effettivamente più lento. Non conosco SQL Server ma troverai molti trucchi per suggerire l'ottimizzatore mySQL per creare query in modi specifici per aggirare questo problema.

Gli DBA hanno pagato un sacco di soldi per sapere di cose strane come questo con indici (tra le altre cose) quindi sì, ci sono degli svantaggi nell'aggiungere molti indici quindi state attenti. Appoggiati pesantemente al tuo profiler della query e non limitarti a gettare gli indici alla cieca sui problemi.

1

Dai un'occhiata alle colonne usate nelle tue clausole where, guarda le colonne usate in join se ce ne sono. Generalmente la più semplice regola empirica. Gli indici estranei come accennato prima rallenteranno le vostre dichiarazioni DML e generalmente non sono raccomandati. Idealmente, ciò che ho fatto è terminare l'intero modulo e durante la fase di test dell'unità, assicurati di poter eseguire l'analisi del carico sul modulo e quindi verificare se stai vedendo rallentamenti e dopo aver analizzato dove sono i rallentamenti, aggiungi gli indici .

1

Penso che sia già stato risposto, ma fondamentalmente gli indici rallentano inserti/aggiornamenti come l'indice viene aggiornato quando viene inserito un nuovo record (o uno esistente aggiornato).

Anche lo spazio è una considerazione, sia memoria che disco.

Quindi, per i database in cui si verificano numerose transazioni, questo avrà sicuramente un impatto notevole sulle prestazioni (motivo per cui l'ottimizzazione delle prestazioni include l'aggiunta e la rimozione di indici per ottimizzare determinate attività eseguite sul database).

Buona fortuna

Problemi correlati