2010-04-26 13 views
7

Ho letto su MySQL Performance Blog che quando le tabelle sono grandi, è meglio eseguire la scansione di tabelle complete, anziché utilizzare gli indici.Gli indici sono buoni o cattivi per un database di grandi dimensioni?

Ho una tabella con decine di milioni di righe. Quando si eseguono le query, se non utilizzo indici, le query sono 24 volte più lente rispetto agli indici. So che molte cose potrebbero causare questo (ad esempio, le righe sono memorizzate in sequenza), ma puoi darmi qualche suggerimento su cosa potrebbe accadere? O come dovrei iniziare a esaminare questo problema? Voglio capire quando l'uso di indici è preferito e quando non lo è

Grazie

+1

Non riesci nemmeno a respirare senza indici! –

+0

Buon lavoro con test comparativi sul proprio database. Quando si tratta di prestazioni, il test indica sempre in che direzione è più veloce. – phkahler

risposta

8

L'articolo dice che quando si ha a che fare con insiemi di dati molto grandi, in cui la quantità di righe con cui si lavora si avvicina al numero di righe che è nella tabella, l'uso di un indice potrebbe danneggiare le prestazioni.

In questo caso, passare attraverso l'indice danneggerà davvero le prestazioni, a condizione che siano necessari più dati di quelli presenti nell'indice.

Per passare attraverso l'indice, il motore del database deve prima leggere grandi parti della tabella indice (è un tipo di tabella), quindi per ogni riga (o serie di righe) da questo risultato, passare al reale tabella e iniziare a cherrypicking le pagine da leggere.

Se, invece, è necessario recuperare solo le colonne che fanno già parte della tabella dell'indice, il motore del database deve solo leggerle e non continuare sull'intera tabella per ulteriori dati.

Se si finisce per leggere la maggior parte o vicino alla maggior parte della tabella effettiva in questione, tutto il lavoro necessario per gestire l'indice potrebbe essere più sovraccarico di una semplice scansione completa della tabella.

Ora, questo è all l'articolo sta dicendo. Per la maggior parte del lavoro che riguarda un database, l'uso degli indici è la cosa giusta da fare.

Ad esempio, se è necessario estrarre un piccolo gruppo di righe, passare attraverso un indice anziché una scansione completa della tabella sarà più veloce di molti ordini di grandezza.

In ogni caso, in caso di dubbi, è necessario eseguire un po 'di profilazione delle prestazioni per scoprire come si comporta la tua applicazione con diversi tipi di carichi e quindi iniziare a modificare, non prendere un singolo articolo come un proiettile d'argento per qualsiasi cosa.

Ad esempio, un modo per accelerare le query di esempio che fa un conteggio sulla colonna pad nell'articolo, sarebbe quella di creare un unico indice che copriva sia val e pad, in questo modo, il conteggio sarebbe semplicemente un index-scan, e non una scansione indice + ricerca tabella, e sarebbe eseguito più velocemente della scansione completa della tabella.

La soluzione migliore è quello di conoscere i dati, e di sperimentare, e di sapere come gli strumenti che utilizzano il lavoro, così effettivamente, saperne di più su indici, ma alla fine, è si che decide cosa è meglio per il tuo programma.

+1

Come dice l'articolo, "Anche se si guarda l'1% o le righe o meno la scansione completa della tabella potrebbe essere più veloce." Quindi non essere zoppo, ma la risposta sembra essere "dipende dalla situazione specifica". –

+0

Sì, davvero sì. –

1

è buona norma mettere l'indice in ogni colonna, che è stato utilizzato in una clausola WHERE .

2

Come sempre, dipende. Finora non mi sono mai imbattuto in uno scenario come descritto nei post del blog. L'utilizzo di indici sulle mie query per grandi (oltre 50 milioni di righe) è stato dell'ordine di 100-10000 volte più veloce rispetto a una scansione completa di tabelle su questi grandi tavoli.

Probabilmente non c'è un proiettile d'argento qui, devi testare i tuoi particolari dati e le tue particolari richieste.

Problemi correlati