2012-03-21 10 views
5

Nel mio tavolo ho due colonne strettamente correlati A e B. Quali considerazioni possibile devo fatte per decidere se creare:Devo definire l'indice (A) e l'indice (B) o l'indice (A, B) o entrambi?

  • indice (A) e l'indice (B),
  • indice (A, B),
  • entrambi i precedenti?

che modo questo cambiamento se io:

  1. uso solo le query come where A = 5 and B = 10 (e mai come where A = 5),
  2. utilizzare anche le query come where A > 3 and A < 10 and B > 12 and B < 20,
  3. spesso utilizzano order by (A, B),
  4. spesso usi group by (A, B)?

Nota: intenzionalmente non ho fornito ulteriori dettagli sul mio caso particolare in quanto voglio una risposta generale che servirà anche agli altri. Io uso mysql, ma se date una risposta più generale che copre SQL in generale sarebbe grandioso.

+0

nota che ho letto [questa domanda] (http://stackoverflow.com/questions/2291193/mysql-difference-between-add-indexa-add-indexb-and-add-ind) ma non lo fa t coprire tutta la mia domanda. – TMS

+0

Utilizzare EXPLAIN il più possibile sulle query e sperimentare varie configurazioni di indice. Questo dovrebbe essere abbastanza istruttivo! – SirDarius

risposta

4

Ok, quando si ha un indice (A, B), MySQL può anche usarlo come indice (A). Dichiarare AB e A non ha senso. Dichiarare AB e B, tuttavia

in modo da avere queste scelte:

  1. Index (A, B)
  2. Index (A, B) e Index (B)
  3. Index (A) e Index (B)
+1

Bene, grazie! Ma intendi 3 scelte, anche 'Indice (A, B)' da solo? – TMS

+4

Se non si esegue mai una ricerca sulla colonna 'B' senza la colonna' A', è possibile utilizzare anche 'Index (A, B)'. La cosa da ricordare è che ** 'Index (A, B)' non può essere usato per cercare su B da solo **. È logico: pensa a un dizionario su lastname, firstname: trovare tutte le persone con nome 'thomas' in là sarà difficile. – Konerak

+0

grazie Konerak. Ma per quanto riguarda la query 2: 'dove A> 3 e A < 10 and B > 12 e B <20'? Non è un caso in cui è necessario un indice separato per B? – TMS

3

Se si usa sempre entrambe le colonne (o il primo dell'indice) nel vostro WHERE/GROUP BY/ORDER BY si dovrebbe usare index(A,B).

Il secondo nell'indice (in questo caso B) non può essere utilizzato separatamente, ma il primo può (solo il primo in ogni caso).

Quindi, se non si utilizza mai B da solo, quindi index(A,B) dovrebbe essere sufficiente. Se non si utilizza mai A da solo, ma si utilizza B, quindi fare index(B,A). Se si utilizzano entrambi separatamente, ma principalmente insieme, quindi aggiungere l'altro indice separatamente.

+0

Grazie Topener, ma per quanto riguarda la query 2. 'dove A> 3 e A < 10 and B > 12 e B <20'? Non è un caso in cui è necessario un indice separato per B? – TMS

+0

che è corretto @Tomas –

1

un indice su (A,B) gestirà i vostri casi 1, 3 e 4.

Per il caso 2, in cui si dispone di una query range sul A e anche sul B, è meglio avere un indice su (A), e un indice separato su (B) e lasciare che il database decida quale sia il migliore per la query. Può decidere al volo quale indice sia più selettivo in base ai valori nella query. In questo caso, MySQL userà solo un indice, quindi sceglierà quale pensa che gli darà il più piccolo set di righe per l'intervallo dato, e quindi passerà attraverso il filtro di quelle righe per l'altro intervallo.

Quindi, per gestire tutti quei casi che hai citato, vi consiglio di indici su:

  • (A,B)
  • (B)

L'indice sulla (A,B) può essere utilizzata come un indice proprio sulla (A) ogni volta che il database ha bisogno di un indice solo su (A), quindi la definizione di questi due indici è come avere un set "tutto sopra" di (A), (B) e (A,B).

Si noti inoltre che se si desidera ordinare o raggruppare per (B, A), si desidera un indice su (B,A) e (A,B). L'ordine è importante!

Problemi correlati