如果我在分片的mongodb集群上运行以下查询,并且查询是分散/聚集类型。
find({"product": "laptop"}).sort({"year": 1}).skip(15).limit(5)
and和SKIP + LIMITS(组合)是否适用于mongos或单个分片(即mongod)?
或mongos将limit(20)发送到每个分片,即sum(skip + limit)以优化查询并随后应用 在返回客户之前先跳过(15).limit(5)到收集的结果
答案 0 :(得分:0)
我想我找到了您疑问的答案。您可以阅读整个文档部分here,但您感兴趣的部分是这一部分:
mongos如何处理查询修饰符
排序
如果查询结果 未排序,
mongos
实例会打开结果游标,“ robins”是碎片上所有游标的结果。限制
如果查询使用来限制结果集的大小
limit()
游标方法,mongos实例将该限制传递给了 分片,然后将限制重新应用于结果,然后再返回 结果交给客户。跳过
如果查询指定了许多记录,请使用
skip()
游标方法,mongos
无法将跳过传递给分片, 而是从分片中检索未跳过的结果,并跳过 组装完整结果时需要适当数量的文件。与
limit()
结合使用时,mongos
将通过 限制加分片的skip()
的值以改善 这些操作的效率。
如果您担心性能问题,那么最好的办法就是使用explain
获取查询计划。在同一文档上,指定:
有关如何将聚合工作拆分的更多信息 分片群集查询的组件,请使用
explain:true
作为参数 转到aggregation()
调用。返回将包括三个json对象。 mergeType 显示合并阶段发生的位置(“ primaryShard”, “ anyShard”或“ mongos”)。 splitPipeline 显示您的哪些操作 管道在单个碎片上运行。 碎片显示每个作品 分片已完成。