2012-04-19 12 views
2

(「RF」のスパース・インデックス化されている)MongoDBのインデックスと自然ソートの最適化

db.log.find({ rf : 'o-5556457634'}).sort({ '$natural' : -1 }).explain(); 
{ 
"cursor" : "ReverseCappedCursor", 
"nscanned" : 1654468, 
"nscannedObjects" : 1654468, 
"n" : 4, 
"millis" : 2932, 
"nYields" : 5, 
"nChunkSkips" : 0, 
"isMultiKey" : false, 
"indexOnly" : false, 
"indexBounds" : { 

} 
} 

は思わインデックス付き( 'rf')フィールドは、クエリを大幅に遅くします。これは期待された期待された動作ですか? find/indexの後に 'natural'ソートを計算してはいけませんか? 「天然」ソート無し

db.log.find({ rf : 'o-5556457634'}).explain(); 
{ 
"cursor" : "BtreeCursor rf_1", 
"nscanned" : 4, 
"nscannedObjects" : 4, 
"n" : 4, 
"millis" : 0, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"isMultiKey" : false, 
"indexOnly" : false, 
"indexBounds" : { 
    "rf" : [ 
     [ 
      "o-5556457634", 
      "o-5556457634" 
     ] 
    ] 
} 

ヒント「RF」インデックスを使用するようにエンジンを強制ないが、結果は、バイパス(リバース)ソート

db.log.find({ rf : 'o-5556457634'}).sort({ '$natural' : -1 }).hint({rf :1}).explain(); 
{ 
"cursor" : "BtreeCursor rf_1", 
"nscanned" : 4, 
"nscannedObjects" : 4, 
"n" : 4, 
"scanAndOrder" : true, 
"millis" : 0, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"isMultiKey" : false, 
"indexOnly" : false, 
"indexBounds" : { 
    "rf" : [ 
     [ 
      "o-5556457634", 
      "o-5556457634" 
     ] 
    ] 
} 
} 

答えて

1

それを「自然」 sortを追加するとクエリオプティマイザが間違ったことをしているように見えます。

.hint({rf :1})をクエリに追加して、何が起こるか試してみることはできますか?

+0

質問をヒント説明で更新しました。エンジンは 'rf'インデックスを使用するように強制しますが、結果は(逆の) '自然な'並べ替えをバイパスします。 – user1345178

+0

ソートの前に移動しようとしましたか? –

+0

はい、同じ結果が返されます(自然な並べ替えは無視されます)。理想的には、「検索」クエリが動的になるため、クエリをできるだけシンプルに/直感的に保つためのヒントを避けたいと考えています。インデックスの使用をウィンドウの外にスローする「自然な」ソートが必要かどうかを理解しようとしています。 – user1345178

0

同じ問題に直面しましたが解決策が見つかりました。 "_id": - 1フィールドを追加して検索フィルタで言及しているフィールドにインデックスを作成し、sort({"_ id": - 1})を使用することができます。 助けてください。

関連する問題