【问题标题】:Querying mongodb - Using limit vs re-querying查询 mongodb - 使用限制与重新查询
【发布时间】:2013-02-19 05:10:08
【问题描述】:

场景是这样的:

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

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

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

所以,我可以

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

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

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

【问题讨论】:

  • 你能分享一些代码吗?

标签: mongodb limit


【解决方案1】:

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

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

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

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

你真正要找的是range based pagination,只要你有一个唯一的列,你就可以使用$lt$gt进行排序和使用。有关如何实现基于范围的分页的另一个示例,请参阅 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-08
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    相关资源
    最近更新 更多