MongoDB发现随机数据集性能



我有一个大约有500000个数据集的集合,我喜欢从中找到一个随机的数据集。我可以将find()限制为客户id,这样可以将大小减少到大约80000个集。指数也被添加到客户id中。

在PHP中,我使用以下命令来获取随机数据集:

 $mongoCursor = $mongoCollection->find($arrQuery, $arrFields)->skip(rand(1, $dataCount));

剖析器现在告诉:

 DB.Collection ntoskip:3224 nscanned:3326 nreturned:101 reslen:77979 262ms

获取结果需要相当长的时间。有没有更好的方法来获取数据?

我想过在PHP中获取所有id,然后随机获取一个id并找到这个id的完整集合。但我担心在PHP中提取这么多数据。

谢谢你对这个话题的思考。Dan

Skip强制Mongo遍历结果集,直到它到达您要查找的文档,因此查询的结果集越大,所需时间就越长。

这个用例真正需要的是一种随机识别文档的方法,而不是随机查询文档。你可以给每个文档一个增量标识符,然后在已知的id范围内随机选择一个数字,直到找到一个存在的ID为止,但如果你删除了很多文档,或者需要应用一个过滤可能匹配项的查询,那么这个范围将是稀疏的,最终可能需要更长的时间才能找到结果。这取决于您的数据和使用情况。

如果此方法不适用于您的数据和使用情况,您也可以尝试此处讨论的方法:http://cookbook.mongodb.org/patterns/random-attribute/

底线是mongo不会为你做这件事,所以这真的取决于你如何在数据中随机识别文档。

嗨,我尝试了多种随机问题的解决方案。我使用了一个光标并将其移动到随机位置,但这非常慢。然后我使用了完整的数据集,并随机挑选了一些项目,这还可以,但可能会更好。

对我来说,性能最好的解决方案是选择随机数,取最小值和最大值,并使用查询数据库

db.collection.find({...}).skip(min).limit(max-min);

然后我只对结果进行了一次迭代,并比较了一个从I=min开始的索引;i++;并且只取与随机集合中的数字匹配的项目。对我来说,随机限制最小和最大的面积也是可以的。我使用对数方法根据我的集合大小选择最小-最大窗口的大小。

Result是挑选随机结果集的一种非常快速的方法。

希望这也能帮助到别人。

---Dan

最新更新