情景是:
我正在查询数据(呃!)
潜在地过滤一些服务器端,因为要完全查询是不可能的/合理的,即复杂的查询
数据库可能承受相当大的负担。可能有许多并行请求,包括更新。
所以,我可以
a)不限制()查询,只保留流数据,直到我得到足够的数据。但是,响应时间很重要,因此如果所需数据太稀疏,则可能必须在检索整个页面之前返回部分集。
b)使用limit()但偶尔会重新查询几次以尝试检索整页数据。同样,最终结果仍然可能不是整套。这里的想法是,增加几个额外的请求将减少数据库的负担。
我理解这可能是“它取决于”,但我想知道是否有人对最佳实践有一些了解,或者是最佳起点。
答案 0 :(得分:2)
选项(a)将对您说已经承受相当大负荷的数据库施加额外的过度负荷。原因是如果没有限制,nscan
命令上的explain
可能很大,导致MongoDB服务器负载过重。在我看来,这是一个非常糟糕的主意。
您可以使用limit
,但请注意,随着skip
尺寸的增加,简单的limit
和skip
会变得越来越贵。来自MongoDB文档:
不幸的是,跳过可能(非常)昂贵,并且要求服务器从集合或索引的开头走,以便在它开始返回数据页面(限制)之前到达偏移/跳过位置。随着页码数量的增加,使用更大的集合,skip将变得更慢,cpu更密集,并且可能是IO绑定。
基于范围的分页可以更好地使用索引,但不允许您轻松跳转到特定页面。
您真正需要的是range based pagination,只要您拥有一个可用于排序并使用$lt
和$gt
的唯一列。有关如何实现基于范围的分页的另一个示例,请参阅here。