MongoDB OR条件索引

时间:2012-11-02 13:12:43

标签: mongodb indexing

我有一个OR查询,我目前正用于半大更新。基本上我的收藏分为两个数据集;

1个主存储库和1个主存储库子集。这只是为了更快地搜索一小部分数据。

然而,我发现我创建的用于将内容拉入子集的查询超时..当查看解释时,看起来实际上发生了两个查询。

PRIMARY> var date = new Date(2012,05,01);
PRIMARY> db.col.find(
  {"$or":[
      {"date":{"$gt":date}},
      {"keywords":{"$in":["Help","Support"]}}
   ]}).explain();

这会产生:

{
"clauses" : [
    {
        "cursor" : "BtreeCursor ldate_-1",
        "nscanned" : 1493872,
        "nscannedObjects" : 1493872,
        "n" : 1493872,
        "millis" : 1035194,
        "nYields" : 3396,
        "nChunkSkips" : 0,
        "isMultiKey" : false,
        "indexOnly" : false,
        "indexBounds" : {
            "ldate" : [
                [
                    ISODate("292278995-01--2147483647T07:12:56.808Z"),
                    ISODate("2012-06-01T07:00:00Z")
                ]
            ]
        }
    },
    {
        "cursor" : "BtreeCursor keywords_1 multi",
        "nscanned" : 88526,
        "nscannedObjects" : 88526,
        "n" : 2515,
        "millis" : 1071902,
        "nYields" : 56,
        "nChunkSkips" : 0,
        "isMultiKey" : false,
        "indexOnly" : false,
        "indexBounds" : {
            "keywords" : [
                [
                    "Help",
                    "Help"
                ],
                [
                    "Support",
                    "Support"
                ]
            ]
        }
    }
],
 "nscanned" : 1582398,
 "nscannedObjects" : 1582398,
 "n" : 1496387,
 "millis" : 1071902
}

我可以更好地编制索引以使其更快吗?似乎只是放慢了......

提前致谢!

2 个答案:

答案 0 :(得分:1)

$or query将分别评估每个子句并合并结果以删除重复项..因此,如果要优化查询,则应首先单独尝试explain()每个子句。

看起来问题的一部分是你在积极写入该集合时检索大量文档,高nYields(3396)证明了这一点。在查询运行时,应该检查mongostat输出以考虑其他因素,例如页面错误,锁定%和读/写队列。

如果您希望更快地为大量文档和非常活跃的集合更新提供此查询,请考虑以下两种最佳实践方法:

1)预聚合

基本上,这是在插入/更新文档时更新聚合统计信息,以便您可以进行快速实时查询。 MongoDB手册更详细地描述了这个用例:Pre-Aggregated Reports

2)增量地图/减少

incremental Map/Reduce方法可用于计算连续批次中的聚合统计数据(例如,来自每小时或每日的cron作业)。使用此方法,您可以使用reduce输出选项执行Map / Reduce以将结果保存到新集合,并包含query过滤器,该过滤器仅选择自上次创建/更新后的文档地图/减少工作已经完成。

答案 1 :(得分:0)

我认为您应该在日期和关键字上创建复合索引。根据您的用例

,请参阅以下帖子了解更多细节

how to structure a compound index in mongodb