3

我有一个 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
}

有什么我可以更好地索引以使其更快吗?似乎只是慢慢来...

提前谢谢!

4

2 回答 2

1

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

看起来问题的一部分是您正在检索大量文档,同时积极写入该集合,如高nYields(3396) 所示。mongostat在查询运行时检查输出以考虑页面错误、锁定百分比和读/写队列等其他因素是值得的。

如果您想对大量文档和非常活跃的集合更新加快查询速度,可以考虑以下两种最佳实践方法:

1)预聚合

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

2)增量映射/减少

增量 Map/Reduce方法可用于计算连续批次中的聚合统计信息(例如,来自每小时或每天的 cron 作业)。使用这种方法,您可以使用reduce输出选项执行 Map/Reduce 以将结果保存到新集合中,并包含一个query过滤器,该过滤器仅选择自上次运行此 Map/Reduce 作业以来已创建/更新的文档。

于 2012-11-03T13:40:20.367 回答
0

我认为您应该在日期和关键字上创建一个复合索引。根据您的用例,请参阅以下帖子以获取更多详细信息

如何在mongodb中构建复合索引

于 2012-11-02T13:18:31.980 回答