2012-03-07 20 views
7

ipotizza un ipotetico documento con 3 campi:MongoDB - Indice univoco vs indice composto

  1. _id: ObjectID
  2. emailAddress: stringa
  3. conto: stringa

Ora, data una query sull'indirizzo emailAddress, quale dei seguenti due indici avrà un rendimento migliore:

  1. indice univoco solo emailAddress (assumere è un campo unico)
  2. indice composito su conto e emailAddress

risposta

14

In termini di prestazioni la differenza sarà piccolo al meglio. A causa del fatto che i vostri indirizzi e-mail sono unici, qualsiasi indice composto che abbia un campo di posta elettronica non sarà mai più utile di un indice solo sull'indirizzo di posta elettronica. Il motivo è che il tuo campo di posta elettronica ha già la cardinalità massima per la tua raccolta e qualsiasi ulteriore campo di indice non aiuterà il database a filtrare i record più velocemente poiché arriverà sempre sui documenti corretti con solo il campo della posta elettronica.

In termini di utilizzo della memoria (che è molto importante per database come MongoDB) anche l'indice di posta elettronica è molto più piccolo.

TL; DR: Utilizzare l'indice solo sull'indirizzo di posta elettronica.

+0

Questa è la direzione in cui mi sono appoggiato, e la considerazione dello spazio in genere significherebbe che solo l'indice di posta elettronica è la decisione corretta. Questo è il motivo per cui l'ho svalutato. Tuttavia nella tua risposta non vedo una prova convincente di quale delle due opzioni funzioni meglio nel caso medio. –

+2

Beh, dovrebbe essere facile da dedurre. Se l'indice A (solo e-mail) rende esattamente lo stesso albero b come l'indice B (composto) non esiste uno scenario possibile in cui l'indice composto può essere più veloce. –

3

Quando si tratta di indici, l'obiettivo è creare un indice singolo con la cardinalità (o "selettività") più elevata possibile. Prova a scrivere query che utilizzano 1 (composto) indice per query. Gli indici unici hanno la cardinalità massima. L'associazione di indici unici con campi meno selettivi non può aumentare ulteriormente il massimo. L'aggiunta di altri indici rallenta solo le query find(), update() e remove(). Quindi sii "magro e cattivo".

Tuttavia, se si utilizza sort() sul campo di conto, mentre si fa un find() sul campo di e-mail, quindi si dovrebbe utilizzare un indice composto:

è comune a interrogare su più chiavi e per ordinare i risultati . Per queste situazioni, gli indici composti sono i migliori. http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ

Quindi pensaci! Se hai bisogno di ordinare i dati per un altro campo, di solito hai bisogno di un indice composto.