2009-04-18 11 views
15

Recentemente ho velocizzato una query complicata di un ordine di grandezza dando a SQLite un buon indice su cui lavorare. Risultati come questo mi chiedo se dovrei indicizzare molti altri campi che sono comunemente usati per le clausole JOIN o ORDER BY. Ma io non voglio essere troppo zelante e mi ritorto contro di me: presumo che ci debbano essere dei motivi non per creare indici, o ogni campo dovrebbe essere indicizzato di default.Quali sono gli svantaggi di avere molti indici?

In questo caso sto utilizzando SQLite, ma ovviamente il consiglio agnostico di DBMS è ben accetto.

risposta

36

Gli indici rallentano inserimenti e aggiornamenti (che possono diventare un problema molto serio con il blocco) e costano spazio su disco. Questo è praticamente tutto.

+2

Questo lo copre. Non dimenticare che * hai * bisogno di indici adeguati per buone prestazioni di inserimento/aggiornamento/eliminazione. Come tutte le cose, è un equilibrio. Gli inserimenti –

+5

non beneficiano degli indici ... Gli aggiornamenti e le eliminazioni richiedono di trovare le righe pertinenti, in modo che possano beneficiare degli indici per quel passaggio, ma se si dispone di molti indici, anche tale vantaggio può essere negato. Come dici tu, è tutto un equilibrio :) – MatBailie

6

Gli indici utilizzano lo spazio su disco per archiviare e richiedono tempo per la creazione e la manutenzione. Quelli non utilizzati non danno alcun beneficio. Se ci sono molti indici candidati per una query, la query può essere rallentata facendo in modo che il server scelga quello "sbagliato" per la query.

Utilizzare questi fattori per decidere se è necessario un indice.

Generalmente è possibile creare indici che NON verranno MAI utilizzati, ad esempio, e indicizzati su un campo (non nullo) con due soli valori possibili, quasi certamente sarà inutile.

È necessario spiegare le query della propria applicazione per assicurarsi che quelle utilizzate frequentemente utilizzino indici sensibili, se possibile, e non creare più indici del necessario per farlo.

+0

L'indicizzazione di un campo a due valori può (occasionalmente) essere utile quando la distribuzione è estremamente disomogenea - e il database lo sa attraverso le statistiche. –

5

Il costo di un indice nello spazio su disco è generalmente banale. Il costo delle scritture aggiuntive per aggiornare l'indice quando la tabella cambia spesso è moderato. Il costo del blocco aggiuntivo può essere grave.

Dipende dal rapporto lettura/scrittura sulla tabella e dalla frequenza con cui l'indice viene effettivamente utilizzato per velocizzare una query.

+1

Hmmm, a seconda della tabella e dei campi da indicizzare, il costo dello spazio su disco non è sempre banale. Ho avuto molti casi in cui la somma dello spazio indice era il doppio (o più) della somma del tablespace ... – MatBailie

+0

Accetto con Dems; per una tabella ristretta, un indice non cluster può essere di dimensioni comparabili al tavolo. Dire che un indice costa la metà dello spazio su disco del tavolo stesso; una tabella con sei indici è quattro volte più grande sul disco di quella non indicizzata. Gli indici raggruppati sono fondamentalmente gratuiti. –

+1

No, il costo di un indice nello spazio su disco non è "generalmente banale".È possibile utilizzare molto spazio con indici. – MarkR

6

Per testare la tua particolare applicazione puoi mettere "EXPLAIN QUERY PLAN" davanti a qualsiasi query che stai eseguendo e controllare i risultati. Ti mostrerà dove si trova o non sta usando gli indici.

In questo modo è possibile determinare dove è possibile utilizzare più indici e in cui non farebbero alcuna differenza.

Sqlite Explain

Io uso SqliteSpy a mano di query di prova che sembrano essere la causa problemi.

Problemi correlati