2012-11-03 15 views
5
I have a collection such as: 
{u'_id': ObjectId('5094cc44e3f0f827b3618918'), 
    u'xxx': 0}, 
{u'_id': ObjectId('5094cc44e3f0f827b3618919'), 
    u'xxx': 1}, 
{u'_id': ObjectId('5094cc44e3f0f827b361891a'), 
    u'xxx': 2}, 
{u'_id': ObjectId('5094cc44e3f0f827b361891b'), 
    u'xxx': 3}, 
{u'_id': ObjectId('5094cc44e3f0f827b361891c'), 
    u'xxx': 4} 
... 

ben gibi indeksi oluştururken:Mongodb dizini nasıl çalışır?

db.test.find({"xxx":1}).sort("_id",-1).skip(5).limit(5).explain() 

result is: 
{u'allPlans': [{u'cursor': u'BtreeCursor _id_ reverse', 
       u'indexBounds': {u'_id': [[{u'$maxElement': 1}, 
              {u'$minElement': 1}]]}, 
       u'n': 9, 
       u'nscanned': 34, 
       u'nscannedObjects': 34}, 
       {u'cursor': u'BtreeCursor xxx_1', 
       u'indexBounds': {u'xxx': [[1, 1]]}, 
       u'n': 34, 
       u'nscanned': 34, 
       u'nscannedObjects': 34}, 
       {u'cursor': u'BtreeCursor _id_-1_xxx_1', 
       u'indexBounds': {u'_id': [[{u'$maxElement': 1}, 
              {u'$minElement': 1}]], 
           u'xxx': [[1, 1]]}, 
       u'n': 10, 
       u'nscanned': 38, 
       u'nscannedObjects': 10}, 
       {u'cursor': u'BasicCursor', 
       u'indexBounds': {}, 
       u'n': 16, 
       u'nscanned': 34, 
       u'nscannedObjects': 34}], 
u'cursor': u'BtreeCursor xxx_1', 
u'indexBounds': {u'xxx': [[1, 1]]}, 
u'indexOnly': False, 
u'isMultiKey': False, 
u'millis': 1, 
u'n': 5, 
u'nChunkSkips': 0, 
u'nYields': 0, 
u'nscanned': 34, 
u'nscannedAllPlans': 140, 
u'nscannedObjects': 34, 
u'nscannedObjectsAllPlans': 112, 
u'scanAndOrder': True, 
u'server': u'ubuntu:27017'} 
n, nscanned gelen

ve nscnnedObjects 'ın num, ben Kullanımı gerektiğini düşünüyorum: o zaman

db.test.ensure_index([("_id",-1),("xxx",1)]) 
db.test.ensure_index([("xxx",1)]) 

, ben gibi açıklamak kullanmak u'BtreeCursor id -1_xxx_1 'imleç olarak, ancak neden u'cursor' kullanıyorsunuz: u'BtreeCursor xxx_1 ',? Bana herhangi bir öneride bulunabilir misiniz? İndeksi optimize etme hakkında biraz bilgim var.

+0

Javascript'te (resmi mongo kabuk dili) örnekler verdiyseniz bu yardımcı olur. –

+0

Bu bir python dilidir. Bulmak istediğimde ('xxx'). Sort ('_ id', - 1), Nasıl bir dizin oluşturabilirim? – halostack

+0

Dizin tanımının sonuna sıralamak istediğiniz alanı seçin: 'db.test.ensureIndex ({xxx: 1, _id: -1})' –

cevap

3

Dizindeki alanların sırası önemlidir; senin Bulma işlemi için en iyi bileşik endeksi ve örnek sıralamak aslında olacaktır: Arama Kriterleri yana

db.test.ensure_index([("xxx",1),("_id",-1)]) 

, 'xxx' alanına üzerindedir _id göre arama ve daha sonra filtreleme daha fazla sonuç bulacaksınız endekste ilk bu alanı koyarak xxx kriterlerine uyan belgelere.

allPlans'da sorgu iyileştiricisi tarafından düşünülen her bir plan için n numarasına bakarsanız, BtreeCursor xxx_1 dizini aslında en iyi sonuçları döndürür (34). Diğer dizinler 9, 10 ve 16 sonuçları döndürür. Bu nedenle, verilen arama kriterleri için daha az verimli olur.

Dizin en iyi duruma getirme hakkında daha fazla bilgi için, bu makalenin çok faydalı olduğunu unutmayın: Optimizing MongoDB Compound Indexes.