2011-12-09 15 views
12

Tengo una colección con estos índices:mongodb no usa índices al ordenar?

> db.message.getIndexKeys() 
[ 
    { 
     "_id" : 1 
    }, 
    { 
     "msgid" : 1 
    }, 
    { 
     "keywords" : 1, 
     "msgid" : 1 
    } 
] 

y una consulta como

db.message.find({'keywords': {'$all': ['apple', 'banana']}}).limit(30).explain() 

funciona bien con el índice

{ 
    "cursor" : "BtreeCursor keywords_1_msgid_1",  
    "nscanned" : 96, 
    "nscannedObjects" : 96, 
    ... 
} 

pero cuando se ordenan con msgstr:

db.message.find({'keywords': {'$all': ['apple', 'banana']}}) 
    .sort({msgid:-1}) 
    .limit(30).explain() 

mongodb no usan índices de los otros:

{ 
"cursor" : "BtreeCursor msgid_1 reverse", 
"nscanned" : 1784455, 
"nscannedObjects" : 1784455, 
... 
} 

alguna solución?

Respuesta

32

Mongo realmente es usando un índice (que se puede ver al ver BtreeCursor en la explicación), simplemente no el compuesto.

Es importante tener en cuenta que la dirección importa cuando se tiene un índice compuesto.

Probar: db.ensureIndex({ keywords: 1, msg_id: -1 })

Mongo opta por utilizar el índice msg_id a la inversa en su ejemplo, porque es más rápido para recuperar los resultados en forma ordenada y luego coincidir en O (n) que para que coincida con los resultados y luego una especie de Hora O (nlogn).

+2

+1 excelente respuesta! – Petrogad

+0

¡Gracias, señor! –

+1

agregar un índice inverso ayudó. gracias. – Bearice

1

Está usando un índice - el índice en msgid. MongoDB elige un índice para usar en una consulta probando todos los índices posibles y utilizando el que termine primero. Este resultado se almacena en caché para 1,000 consultas, o hasta que se realice una cierta cantidad de modificaciones en la colección (cambios de datos, nuevos índices, etc.).

Puede ver todos los planes de consulta probados pasando true a explain().

Para obtener más información, consulte http://www.mongodb.org/display/DOCS/Query+Optimizer.

Cuestiones relacionadas