14

私はこれらのインデックスを持つコレクションを持っています:

> db.message.getIndexKeys()
[
    {
        "_id" : 1
    },
    {
        "msgid" : 1
    },
    {
        "keywords" : 1,
        "msgid" : 1
    }
]

そして次のようなクエリ

db.message.find({'keywords': {'$all': ['apple', 'banana']}}).limit(30).explain()

インデックスで正常に動作します

{
    "cursor" : "BtreeCursor keywords_1_msgid_1",    
    "nscanned" : 96,
    "nscannedObjects" : 96,
    ...
}

ただし、msgid でソートする場合:

db.message.find({'keywords': {'$all': ['apple', 'banana']}})
    .sort({msgid:-1})
    .limit(30).explain()

mongodb はもうインデックスを使用しません:

{
"cursor" : "BtreeCursor msgid_1 reverse",
"nscanned" : 1784455,
"nscannedObjects" : 1784455,
...
}

解決策はありますか?

4

2 に答える 2

33

Mongo は実際にインデックスを使用しています (説明で BtreeCursor を見ればわかります)。複合インデックスではありません。

複合インデックスがある場合、方向が重要であることに留意することが重要です。

試す:db.ensureIndex({ keywords: 1, msg_id: -1 })

Mongo は、結果を一致させてから O(nlogn) 時間で並べ替えるよりも、並べ替えられた順序で結果を取得してから O(n) 時間で一致させる方が速いため、この例では msg_id インデックスを逆に使用することを選択します。

于 2011-12-09T03:38:25.200 に答える
1

インデックスを使用しています -- のインデックスmsgidです。MongoDB は、可能なすべてのインデックスを試し、最初に終了したものを使用することで、クエリに使用するインデックスを選択します。この結果は、1,000 回のクエリに対して、またはコレクションに対して一定数の変更 (データの変更、新しいインデックスなど) が行われるまでキャッシュされます。

trueに渡すことで、試行されたすべてのクエリ プランを確認できますexplain()

詳細については、http://www.mongodb.org/display/DOCS/Query+Optimizerを参照してください。

于 2011-12-09T03:37:16.703 に答える