2011-12-09 10 views
12

Ho una collezione di questi indici:mongodb non utilizza gli indici durante l'ordinamento?

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

e una query come

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

funziona bene con indice

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

ma quando sono ordinati con msgstr:

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

MongoDB non usano gli indici più:

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

eventuali soluzioni?

risposta

32

Mongo in realtà è utilizzando un indice (che si può vedere vedendo BtreeCursor nello spiegare), non solo quello composto.

È importante tenere a mente che la direzione è importante quando si dispone di un indice composto.

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

Mongo sceglie di utilizzare indice msg_id in retromarcia nel tuo esempio, perché il suo più veloce per recuperare i risultati in modo ordinato e poi corrispondere a O (n) che per abbinare i risultati e poi quelli in O (nlogn) tempo.

+2

+1 ottima risposta! – Petrogad

+0

Grazie buon signore! –

+1

aggiungendo un indice inverso ha aiutato. grazie. – Bearice

1

Sta usando un indice - l'indice su msgid. MongoDB sceglie un indice da usare per una query provando tutti gli indici possibili e usando quello che finisce per primo. Questo risultato viene memorizzato nella cache per 1.000 query o fino a quando viene apportato un certo numero di modifiche alla raccolta (modifiche di dati, nuovi indici, ecc.).

È possibile visualizzare tutti i piani di query provati passando da true a explain().

Per ulteriori dettagli, vedere http://www.mongodb.org/display/DOCS/Query+Optimizer.

Problemi correlati