mongodb - 了解 Mongo Explain 索引扫描到许多结果

标签 mongodb optimization indexing

我正在尝试了解如何更好地为我看到的使用长查询运行的 Mongo 查询构建索引。

目前我看到的是这样的:

"cursor" : "BtreeCursor modTime_-1_color_1 multi",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 0,
"nscanned" : 104936,
"nscannedObjectsAllPlans" : 104935,
"nscannedAllPlans" : 314806,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 70,
"nChunkSkips" : 0,
"millis" : 14237,
"indexBounds" : {
    "modTime" : [
        [
            {
                "$maxElement" : 1
            },
            {
                "sec" : 1360267645,
                "usec" : 0
            }
        ]
    ],
    "color" : [
        [
            "Green",
            "Green"
        ],
        [
            "Blue",
            "Blue"
        ],
        [
            "Yellow",
            "Yellow"
        ]
    ]
},

查询看起来像:

{"modTime":{"$gte":{"sec":1360267645,"usec":0}},"color":{"$in":["Green","Blue","Yellow"]}}

我是否应该做一些不同的事情来创建这个索引,这样它就不会扫描这么多结果?

提前感谢您的想法和建议。

最佳答案

nscanned 计数是 modTime 大于所提供时间的文档总数。

如果颜色字段中有很好的可变性,那么您可能会受益于反转索引,这样颜色是第一个字段,modTime 是第二个。

db.<collection>.createIndex( { color: 1, modTime : -1 } ) 

这将只扫描 modTime 大于提供时间的正确颜色的文档数。如果集合中的唯一颜色是绿色、蓝色和黄色,则没有任何好处。如果至少有一些额外的颜色,您应该会得到一些好处。

警告:如果您有仅使用 modTime 的查询,则它们将无法使用新索引。

另一种可能的解决方案是使用 $lt(或 $lte)表达式关闭 modTime 范围。您将必须确定这对于您的查询是否可行,或者它是否会对可能要评估的文档数量产生影响。

关于mongodb - 了解 Mongo Explain 索引扫描到许多结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14862951/

相关文章:

python - Pandas 表子集给出无效类型比较错误

list - 如果知道某个仓位的指数,如何找到该仓位的负指数?

node.js - 从 Mongoose 模型生成测试数据

java - 使用 contentType 获取时 Spring Data MongoDB GridFS 图像损坏

ruby - `require' : cannot load such file -- mongo (LoadError)

javascript - 如何在数组中搜索多个可能的匹配项

sql - 如何在mysql中有效存储连续变量

java - 如何解析 XML 字符串并检索元素的字符索引?

optimization - 需要帮助理解 PySpark 解释输出

c++ - 如何优化一个周期?