当排序字段不是分片键的一部分时,mongos会对所有mongod返回的数据进行排序吗?

时间:2012-08-29 03:26:17

标签: mongodb sharding

当排序字段不是分片键的一部分时,mongos会将查询发送到所有mongod实例。在所有mongod实例返回数据后,mongos将合并它们。

此合并操作是否包含排序?

我们知道sort字段不是分片键的一部分,因此返回的数据应该是无序的,mongos必须进行排序。如果是这样,当返回的数据非常大时,mongos将占用大量内存。

我的理解是否正确?

2 个答案:

答案 0 :(得分:4)

这不是需要在分片键中的排序字段,而是您用来选择数据的标准。也就是说,如果mongos无法从您正在使用的字段中确定数据生成的查询的一部分,那么它将发送到所有分片。这与任何其他非排序查询相同。在非shardkey字段上排序不会影响mongos正确路由查询的能力。

这在文档中提到:

https://docs.mongodb.org/v2.4/core/sharded-cluster-query-router/#how-mongos-handles-query-modifiers

分片将从mongos接收查询,他们将对其结果子集进行排序,并将它们发送回mongos。然后mongos必须对返回的结果进行合并排序,然后再将它们呈现出来。这并不像完整排序那样密集,因为结果最初是由分片排序的,但仍然需要资源。消耗的内存量将与各个分片返回的结果集的大小相关。

编辑(2016年5月):以上在2012年最初回答时属实,但(如下面的评论所述)2014年版本2.6的行为发生了变化。{{3}在返回到mongos(然后再返回给用户)之前,对分片数据库进行合并排序的主分片。这很有意义,因为mongos实例不太可能有资源执行大型排序,但它确实意味着您应该密切注意将要经常排序的任何数据库的主要位置结果会看到更高的负荷。

答案 1 :(得分:0)

在3.2版本中,如果主要分片未在fetch中使用(换句话说,主分片不包含find命令中的任何文档),则可以使用辅助分片。