【问题标题】:MongoDB Index and Natural Sort OptimizationMongoDB 索引和自然排序优化
【发布时间】:2012-05-01 12:25:53
【问题描述】:

在 capped-collection 上按反向插入顺序排序的最快方法是什么('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”)字段的使用,显着减慢了查询速度。这是预期的预期行为吗?不应该在查找/索引之后计算“自然”排序吗?

没有“自然”排序:

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

【问题讨论】:

    标签: sorting mongodb indexing


    【解决方案1】:

    当您添加 sort 时,查询优化器似乎做错了事。

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

    【讨论】:

    • 刚刚用提示解释更新了问题。它确实会强制引擎使用“rf”索引,但结果会绕过(反向)“自然”排序。
    • 是的,结果相同(反向自然排序被忽略)。理想情况下,我想避免“提示”以使查询尽可能简单/直观,因为“查找”查询将是动态的。试图了解是否期望“自然”排序将索引使用抛到窗外。
    • 显然没有使用自然排序和索引的机制。很奇怪,但似乎没有内置方法可以完成这样的基本任务。
    【解决方案2】:

    遇到同样的问题,但找到了解决方案。 您可以通过添加“_id”:-1 字段在查找过滤器中提到的字段上创建索引,然后使用排序({“_id”:-1})。 帮助了我。

    【讨论】:

      猜你喜欢
      • 2012-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多