(「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"
]
]
}
}
質問をヒント説明で更新しました。エンジンは 'rf'インデックスを使用するように強制しますが、結果は(逆の) '自然な'並べ替えをバイパスします。 – user1345178
ソートの前に移動しようとしましたか? –
はい、同じ結果が返されます(自然な並べ替えは無視されます)。理想的には、「検索」クエリが動的になるため、クエリをできるだけシンプルに/直感的に保つためのヒントを避けたいと考えています。インデックスの使用をウィンドウの外にスローする「自然な」ソートが必要かどうかを理解しようとしています。 – user1345178