查询mongodb - 使用限制与重新查询

时间:2013-02-18 20:46:10

标签: mongodb limit

情景是:

  • 我正在查询数据(呃!)

  • 潜在地过滤一些服务器端,因为要完全查询是不可能的/合理的,即复杂的查询

  • 数据库可能承受相当大的负担。可能有许多并行请求,包括更新。

所以,我可以

a)不限制()查询,只保留流数据,直到我得到足够的数据。但是,响应时间很重要,因此如果所需数据太稀疏,则可能必须在检索整个页面之前返回部分集。

b)使用limit()但偶尔会重新查询几次以尝试检索整页数据。同样,最终结果仍然可能不是整套。这里的想法是,增加几个额外的请求将减少数据库的负担。

我理解这可能是“它取决于”,但我想知道是否有人对最佳实践有一些了解,或者是最佳起点。

1 个答案:

答案 0 :(得分:2)

选项(a)将对您说已经承受相当大负荷的数据库施加额外的过度负荷。原因是如果没有限制,nscan命令上的explain可能很大,导致MongoDB服务器负载过重。在我看来,这是一个非常糟糕的主意。

您可以使用limit,但请注意,随着skip尺寸的增加,简单的limitskip会变得越来越贵。来自MongoDB文档:

  

不幸的是,跳过可能(非常)昂贵,并且要求服务器从集合或索引的开头走,以便在它开始返回数据页面(限制)之前到达偏移/跳过位置。随着页码数量的增加,使用更大的集合,skip将变得更慢,cpu更密集,并且可能是IO绑定。

     

基于范围的分页可以更好地使用索引,但不允许您轻松跳转到特定页面。

您真正需要的是range based pagination,只要您拥有一个可用于排序并使用$lt$gt的唯一列。有关如何实现基于范围的分页的另一个示例,请参阅here