【发布时间】:2012-11-02 13:12:43
【问题描述】:
我有一个 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
}
有什么我可以更好地编制索引以加快速度吗?似乎只是慢下来...
提前谢谢!
【问题讨论】:
-
你的索引是多少?只是提交日期?
-
我尝试在关键字和日期上创建单独的索引;并尝试将它们创建为两者之间的复合索引。
-
嗯,您正在那里获取 140 万条记录....数量不少,您可以尝试延长 mongo 游标上的计时器以进行如此大的查询。还有你在这里的设置是什么?我承认 17m 是很长的时间
-
@Sammaye 我正在尝试获取记录并获取所有符合条件的记录,然后将它们移动到仅包含实际字段子集的另一个集合中,从而创建一个可搜索的数据集。跨度>
-
是的,您正在尝试聚合另一个集合,对吗?你是在客户端做的还是这个基于 MR 的?如果客户端基于什么语言(根据可能的驱动程序错误可能会有所不同)?