0

场景是:

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

  • 可能会过滤掉一些服务器端,因为精确查询是不可能/合理的,即复杂查询

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

所以,我可以

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

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

我知道这可能是“视情况而定”,但我想知道是否有人对最佳实践或最佳起点有所了解。

4

1 回答 1

2

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

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

不幸的是,跳过可能(非常)昂贵,并且需要服务器从集合或索引的开头走到偏移/跳过位置,然后才能开始返回数据页面(限制)。随着页码的增加,skip 会变得更慢,CPU 密集度更高,并且可能会受到 IO 限制,并且集合更大。

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

您真正需要的是基于范围的分页,只要您有一个独特的列,您就可以使用它来排序和使用$ltand $gt。有关如何实现基于范围的分页的另一个示例,请参见此处。

于 2013-02-18T21:10:08.310 回答