6
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)])

次に、次のような説明を使用します。

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およびnscnnedObjectsのnumから、カーソルとしてu'BtreeCursor id -1_xxx_1'を使用する必要があると思いますが、なぜu'cursor'を使用するのですか?u'BtreeCursor xxx_1',? 誰かが私にいくつかの提案をすることができますか?私はインデックスの最適化について少し知識があります。

4

1 に答える 1

3

インデックス内のフィールドの順序が重要です。検索と並べ替えの例に最適な複合インデックスは、実際には次のようになります。

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

検索条件はフィールド'xxx'にあるため、このフィールドをインデックスの最初に配置すると、条件_idに一致するドキュメントで検索してからフィルタリングするよりも多くの結果が見つかりますxxx

nのクエリオプティマイザによって考慮される各プランの数を見るとallPlansBtreeCursor xxx_1インデックスは実際に最も多くの結果を返します(34)。他のインデックスは9、10、および16の結果を返すため、指定された検索条件では効率が低下します。

インデックスの最適化の詳細については、この記事が非常に役立ちます:MongoDB複合インデックスの最適化

于 2012-11-03T12:07:03.267 に答える