2012-03-04 19 views
5

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?

Respuesta

2

¿Has probado con el índice {B: 1, C: 1, A: 1, D: 1}? De esta forma, los valores exactos de B y C se pueden procesar rápidamente, se puede usar un rango en el campo A y la ordenación por D aún se puede hacer a través del índice.

+0

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

+1

@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. –

+0

@SergioTulentsev: Me refiero a [este marco amarillo] (http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-IndexingProperties). ¿Me equivoco? – DenisNP

Cuestiones relacionadas