Mongodb索引是如何工作的?

Mongodb索引是如何工作的?,mongodb,indexing,Mongodb,Indexing,创建索引时,例如: 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('5094cc

创建索引时,例如:

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}
...
然后,我使用如下解释:

db.test.ensure_index([("_id",-1),("xxx",1)])
db.test.ensure_index([("xxx",1)])
从n、nscanned和nscnedObjects的num中,我认为它应该使用u'BtreeCursor id-1_xxx_1'作为游标,但为什么它使用u'cursor':u'BtreeCursor xxx_1',?
有人能给我一些建议吗?我对索引优化有一点了解。

索引中字段的顺序很重要;查找和排序示例的最佳复合索引实际上是:

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'}
由于您的搜索条件位于字段“xxx”上,因此将此字段放在索引中的第一位将找到比按
\u id
搜索、然后筛选到与
xxx
条件匹配的文档更多的结果

如果查看查询优化器在
allPlans
中考虑的每个计划的
n
编号,
BtreeCursor xxx_1
索引实际上返回的结果最多(34)。其他索引返回9、10和16个结果。。因此,对于给定的搜索条件,效率会较低


关于索引优化的更多信息,本文非常有用:。

如果您提供javascript(官方mongo shell语言)的示例会有所帮助。这是一种python语言。我只想知道,当我使用find('xxx')。sort('u id',-1),如何创建索引?请在索引定义的末尾放置一个要排序的字段:
db.test.ensureIndex({xxx:1,_id:-1})
谢谢,我已经尝试过了,解决方案还可以。但我有一些问题:在中,有一个建议:使用{xxx':-1,''u id::1},因此,我们可以将最新的更新文档保存在内存中。但它似乎不适合这里。我理解这一点有什么错误吗?排序顺序(1或-1)必须与索引顺序(1或-1)相同,以便排序可以从该索引中受益。如果创建索引
p:1
并使用
p:-1
进行排序,它将不会使用该索引。
db.test.ensure_index([("xxx",1),("_id",-1)])