【问题标题】:MongoDB skip() and limit() on a sharded cluster分片集群上的 MongoDB skip() 和 limit()
【发布时间】:2019-05-04 12:02:41
【问题描述】:

如果我在分片 mongodb 集群上运行以下查询并且查询是分散/聚集类型。

find({"product": "laptop"}).sort({"year": 1}).skip(15).limit(5)

和 SKIP + LIMITS(组合)是否会应用于 mongos 或单个分片(即 mongod)?

或 mongos 向每个分片发送 limit(20) 即 sum(skip+limit) 以优化查询,然后也应用 在返回客户端之前跳过(15).limit(5)到收集的结果

【问题讨论】:

  • 这个问题的意义何在?您想知道 MongoDB 是否会“限制”从每个分片返回的结果,或者“限制”是否真的发生在 mongos 路由器上?究竟是什么问题?您是否认为您的整个收藏都被发送到mongos 路由器?我真的认为这些都不应该让你担心。另一方面,如果您认为查询的 性能 很慢,那么就直接说出来吧。使用 skip()limit() 不是最佳的,文档确实明确说明了这一点。

标签: mongodb sql-limit


【解决方案1】:

我想我找到了你疑惑的答案。你可以阅读整个文档部分here,但你感兴趣的部分是这个:

mongos 如何处理查询修饰符

排序

如果查询结果 未排序,mongos 实例会打开一个结果游标,即“round robins”结果来自分片上的所有游标。

限制

如果查询使用 limit() 游标方法,mongos 实例将该限制传递给 分片,然后在返回之前将限制重新应用于结果 将结果发送给客户端。

跳过

如果查询指定要跳过的记录数,使用 skip() 游标方法,mongos 无法将跳转传递给分片, 而是从分片中检索未跳过的结果并跳过 组装完整结果时的适当数量的文档。

当与limit() 一起使用时,mongos 将传递 限制加上skip() 的值到分片以提高 这些操作的效率。

如果您担心性能,最好的办法是使用explain 获取查询计划。在同一个文档中,指定:

有关聚合工作如何分配的更多信息 分片集群查询的组件,使用explain:true 作为参数 拨打aggregation() 电话。返回将包括三个 json 对象。 mergeType 显示合并阶段发生的位置(“primaryShard”, “anyShard”或“mongos”)。 splitPipeline 显示您的哪些操作 管道已在各个分片上运行。 shards 显示每个作品 shard 已经完成了。

【讨论】:

    猜你喜欢
    • 2018-08-18
    • 2012-06-19
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    相关资源
    最近更新 更多