2012-11-03 10 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} 
... 

wenn ich Index zu erstellen, wie:Wie funktioniert Mongodb Index?

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

dann verwende ich das erklären, wie:

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'} 

von n, nScanned und nscnnedObjects ‚s num, ich denke, es verwenden sollte u'BtreeCursor ID -1_xxx_1 'als Cursor, aber warum es u'cursor verwenden: u'BtreeCursor xxx_1' ,? Kann mir jemand einen Vorschlag machen? Ich habe ein wenig Ahnung über den Index optimieren.

+0

Es würde helfen, wenn Sie Beispiele in Javascript (die offizielle mongo Shell Sprache) zur Verfügung stellen. –

+0

Das ist eine Python-Sprache.Ich möchte nur wissen, wenn ich find ('xxx'). Sort ('_ id', - 1), Wie kann ich einen Index erstellen? – halostack

+0

Geben Sie am Ende der Indexdefinition ein Feld ein, nach dem sortiert werden soll: 'db.test.ensureIndex ({xxx: 1, _id: -1})' –

Antwort

3

Die Reihenfolge der Felder im Index ist wichtig; der beste Verbindung Index für Ihre Entdeckung und Beispiel sortieren wäre tatsächlich:

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

Da Ihre Suchkriterien auf dem Feld ‚xxx‘, dieses Feld setzt ersten im Index wird weitere Ergebnisse finden als von _id Suche und dann Filterung zu Dokumenten, die Ihren xxx Kriterien entsprechen.

Wenn Sie die n Nummer für jeden Plan betrachten, der vom Abfrageoptimierer in allPlans berücksichtigt wird, gibt der BtreeCursor xxx_1 Index tatsächlich die meisten Ergebnisse (34) zurück. Die anderen Indizes geben 9, 10 und 16 Ergebnisse zurück. Dies wäre für die angegebenen Suchkriterien weniger effizient.

Für weitere Informationen zur Indexoptimierung ist dieser Artikel sehr hilfreich: Optimizing MongoDB Compound Indexes.