Domanda

Ho una tabella di MySQL che ha, tra le altre caratteristiche, un timestamp, un tipo e un user_id.
Tutti loro sono ricercabili e / o ordinabile.
E 'meglio creare un indice per ciascuno di essi, o di creare un unico indice composto con tutti e tre, o entrambi?

È stato utile?

Soluzione

La risposta di Pablo è corretto, ma forse potrai non riescono a rendersi conto che un indice composto potrebbe essere giustificata.

È possibile avere più indici e avere idx1(tstamp, user_id) non esclude di dover indx2(tstamp, type) o idx1reverse(user_id, tstamp) e così via ...

indici composti sono più utili quando coprono tutte le condizioni nella tua ricerca, in modo da l'indice si propone sarà più utile per

SELECT * FROM my_table WHERE tstamp = @ts1 AND user_id = @uid AND type = @type

Se si desidera migliorare le prestazioni di tali query è possibile prendere in considerazione l'aggiunta di un indice composito.

L'aspetto negativo degli indici è che rallenta tutte le operazioni di aggiornamento. Tuttavia, le applicazioni più generali fanno molti più seleziona quindi aggiornamenti (sia nelle operazioni termini cioè il numero di dichiarazioni e soprattutto in termini di di record interessati / recuperati) e allo stesso tempo sono molto più tolleranti gli aggiornamenti più lenti (utenti per lo più giudicare la velocità di il sistema non nel momento in cui è necessario aggiornare un record, ma per il tempo necessario per recuperare i record;. YMMV di nuovo e ci sono applicazioni che non rispettano tali norme)

La cosa migliore sarebbe se tu avessi un modo per testare le prestazioni del database in termini di carichi di lavoro tipici (creare alcuni script tipici SQL, indipendente e ripetibile, o creare test di unità a livello di applicazione) e poi si può oggettivamente sintonizzare la vostra base di dati .

Modifica si rendono conto, inoltre, che gli indici possono essere aggiunti e cadere senza alterare il sistema in termini di funzionalità. Pertanto, è possibile sintonizzare gli indici più tardi, durante l'uso effettivo del sistema -. E normalmente si dovrebbe raccogliere e profilare le query SQL lente alla ricerca di condizioni che potrebbero beneficiare di aggiungere indici

Altri suggerimenti

Se avete intenzione di effettuare ricerche su quei campi a parte, si avrà probabilmente bisogno indici separati per rendere le vostre domande più veloci.

Se si dispone di un indice in questo modo:

mysql> create index my_idx on my_table(tstamp, user_id, type);

E si domanda è:

mysql> select * from my_table where type = 'A';

Poi my_idx non sarà che utile per la vostra query e MySQL si finisce per fare una scansione completa della tabella per risolverlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top