MongoDB索引和自然排序优化

时间:2012-04-19 21:54:56

标签: sorting mongodb indexing

在封顶集合上按反向插入顺序排序的最快方法是什么('rf'已被稀疏索引)

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之后计算'自然'排序吗?

没有'自然'排序:

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"
        ]
    ]
}
}

2 个答案:

答案 0 :(得分:1)

当您添加sort时,查询优化器看起来做错了。

您可以尝试在查询中添加.hint({rf :1})以查看会发生什么吗?

答案 1 :(得分:0)

面临同样的问题,但找到了解决方案。 您可以在添加" _id": - 1字段的搜索过滤器中创建索引,然后使用sort({" _id": - 1} )。 帮帮我。