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