Tengo una colección con el índice compuesto de cuatro campos en orden: (A, B, C, D)
Cuando me pregunta como
find({A: val1, B: val2, C: val3}).sort({D: 1}).limit(N)
con estricta es igual en los campos A, B, C se ejecuta muy rápido, como debería ser. Y explain()
me dice que solo se escanearon N documentos.
Si cambio de uno de los iguales a $in
operador (con cerca de 100 elementos de matriz) que explora mucho más cantidad de documentos y se ejecuta más lentamente:
find({A: {$in: [val0, val1, ...]}, B: val2, C: val3}).sort({D: 1}).limit(N)
Otros operadores como $or
tienen el mismo efecto.
Lógicamente, un $in
con 100 elementos debe ser muy similar a 100 consultas individuales con iguales estrictos. La segunda variante se ejecuta mucho más rápido en la base de datos pero requiere obtener todos los elementos (sin límite) con post-clasificación y limitación en el lado del cliente.
¿Tiene sentido dividir esta consulta con $in
en varias consultas con igual para hacer que el cursor escanee menos documentos? ¿Qué será más eficiente en caso de millones de documentos en la colección?
Como dice la documentación, ya que MongoDB v1.6.0 el orden de los campos en el índice compuesto ya no importa: http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ Sin embargo , Probé tu variante y nada cambió. – DenisNP
@DenisNP: si te refieres a [este]] (http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-4.Conserveindexesbyreorderingcolumnsusedonequality%28nonrange%29queries.), Entonces lo tienes incorrecto. El orden de los campos ** no importa en el índice. Simplemente dice que puede omitir algunos campos desde el final (de la definición del índice) sin un golpe de rendimiento serio. –
@SergioTulentsev: Me refiero a [este marco amarillo] (http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-IndexingProperties). ¿Me equivoco? – DenisNP