2012-03-02 14 views
10

Sto cercando di aggiungere un indice composito a una tabella in un database MYSQL che probabilmente sarà di diverse milioni di righe. Il composito sarà composto da due colonne varchar e tre colonne int. La mia domanda è come indicato nel titolo: esiste un ordine ottimale in cui creare questo indice composito? Ad esempio, una delle righe int avrà probabilmente solo 6 valori possibili, sarebbe meglio per quella colonna essere più vicina alla parte anteriore della definizione dell'indice? Allo stesso modo, una delle colonne varchar avrà probabilmente milioni di valori diversi, dovrebbe essere vicino alla parte anteriore o posteriore della definizione dell'indice?Esiste un metodo ottimale per ordinare un indice composito MYSQL?

+0

Stai selezionando con costanti nella tua clausola WHERE, al contrario di un intervallo? –

+0

Marcus, probabilmente selezionerò le costanti per la maggior parte delle query su questa tabella. – chicagoCrazy

risposta

16

Come regola generale, in un indice a più colonne, si desidera che le colonne con la cardinalità più alta o, in altre parole, il numero più alto di valori distinti, vengano prima nell'indice.

Per essere più precisi, si desidera innanzitutto la colonna con il minor numero possibile di corrispondenze ai criteri di ricerca in modo da limitare il più possibile il set di risultati, ma in generale è uguale alla cardinalità più elevata.

Quindi, nel vostro esempio, vorrete la colonna che avrà milioni di valori distinti nell'indice prima di quello con solo 6 valori distinti.

Supponendo di selezionare solo una riga tra i milioni di valori, consente di eliminare più righe più velocemente.

Se si considerano due colonne di cardinalità simile, inserire prima quella più piccola (colonne INTEGER prima delle colonne VARCHAR) perché MySQL può confrontare e scorrere su di esse più velocemente.

Un avvertimento è che se si seleziona con intervalli (ad esempio WHERE datecol > NOW()), quindi si desidera le colonne dell'intervallo più a destra e le colonne con una singola costante (ad esempio WHERE id = 1) a sinistra. Questo perché l'indice può essere utilizzato solo per la ricerca e l'ordine fino al valore del primo intervallo.

+4

La cardinalità non è sempre il criterio giusto: ho una tabella con un indice a più colonne in cui la prima colonna dell'indice ha solo due valori possibili, mentre le colonne successive hanno una cardinalità più elevata. Ciò funziona perché l'indice è progettato per una ricerca specifica che utilizza sempre solo 1 dei 2 valori e tale valore riduce il risultato impostato del 95%. La domanda giusta da porsi è quale colonna ridurrà di più il risultato, e la cardinalità è solo una utile regola empirica. –

+1

@ Kai, il tuo commento mi confonde. Forse potresti dare un esempio specifico. –

+0

@MarcusAdams Capisco cosa sta dicendo Kai, penso che sia spiegato abbastanza bene qui: http://www.percona.com/blog/2009/06/05/a-rule-of-thumb-for-choosing-column -order-in-indexes/ –

Problemi correlati