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

podczas tworzenia indeksu, takich jak:Jak działa indeks Mongodb?

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

następnie używam wytłumaczyć takie jak:

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

z N, nscanned i num nscnnedObjects „s, myślę, że powinien on używać u'BtreeCursor id -1_xxx_1 'jako kursor, ale dlaczego używa "u'cursor": u'BtreeCursor xxx_1' ,? Czy ktoś może mi dać jakąś sugestię? Mam małą wiedzę na temat optymalizacji indeksu.

+0

Pomoże Ci, jeśli podasz przykłady w javascript (oficjalny język powłoki Mongo). –

+0

To jest język python. Po prostu chcę wiedzieć, kiedy używam find ('xxx'). Sort ('_ id', - 1), Jak mogę utworzyć indeks? – halostack

+0

Umieść pole, które chcesz posortować na końcu definicji indeksu: 'db.test.ensureIndex ({xxx: 1, _id: -1})' –

Odpowiedz

3

Kolejność pól w indeksie ma znaczenie; najlepszy wskaźnik związek za znaleziska i sortować Przykładem może być rzeczywiście:

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

Od podanych kryteriów jest na polu „xxx”, wprowadzenie tego pierwszego pola w indeksie będzie więcej wyników niż przeszukiwanie przez _id a następnie filtrowany do dokumentów zgodnych z Twoimi kryteriami xxx.

Jeśli spojrzysz na numer n dla każdego planu uwzględnionego przez optymalizator zapytań w allPlans, indeks BtreeCursor xxx_1 faktycznie zwraca najwięcej wyników (34). Pozostałe indeksy zwracają 9, 10 i 16 wyników. Tak więc byłoby mniej wydajne dla podanych kryteriów wyszukiwania.

Aby uzyskać więcej informacji na temat optymalizacji indeksu, ten artykuł jest bardzo pomocny: Optimizing MongoDB Compound Indexes.

Powiązane problemy