2012-03-04 10 views
5

Ho una collezione con indice composto su quattro campi in ordine: (A, B, C, D)

Quando mi domanda come

find({A: val1, B: val2, C: val3}).sort({D: 1}).limit(N) 

con la massima è uguale ai campi A, B, C e funziona molto velocemente, come dovrebbe essere. E explain() mi dice che sono stati scansionati solo N documenti.

Se cambio una delle pari a $in operatore (con circa 100 elementi in array) esegue la scansione molto più serie di documenti e molto lentamente:

find({A: {$in: [val0, val1, ...]}, B: val2, C: val3}).sort({D: 1}).limit(N) 

Altri operatori come $or hanno lo stesso effetto.

Logicamente uno $in con 100 elementi deve essere molto simile a 100 query individuali con uguali stretti. La seconda variante viene eseguita molto più velocemente nel database ma richiede di ottenere tutti gli elementi (senza limiti) con l'ordinamento e la limitazione del post sul lato client.

Ha senso dividere questa query con $in in diverse query con uguale per rendere la scansione del cursore un numero inferiore di documenti? Cosa sarà più efficiente in caso di milioni di documenti nella collezione?

risposta

2

Avete testato con l'indice {B: 1, C: 1, A: 1, D: 1}? In questo modo i valori B e C esatti possono essere elaborati rapidamente, un intervallo può essere utilizzato sul campo A e l'ordinamento di D può ancora essere fatto tramite l'indice.

+0

Come dice la documentazione, dal momento che MongoDB v1.6.0 l'ordine dei campi nell'indice composto non ha più importanza: http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ Tuttavia , Ho provato la tua variante e nulla è cambiato. – DenisNP

+1

@DenisNP: se intendi [questo] (http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-4.Conserveindexesbyreorderingcolumnsusedonequality%28nonrange%29queries.), Quindi hai capito sbagliato. L'ordine dei campi ** non ha importanza nell'indice. Dice solo che puoi omettere alcuni campi dalla fine (della definizione dell'indice) senza un grave impatto sulle prestazioni. –

+0

@SergioTulentsev: intendo [questa cornice gialla] (http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-IndexingProperties). Ho sbagliato? – DenisNP