在 MongoDB 中 select 分片键需要帮助

Need help to select sharding key in MongoDB

对于我的应用程序,我需要对一个相当大的集合进行分片,整个集合将包含应用程序。 5000 亿份文件。

我有两个可以用作分片键的潜在字段:

对于插入任一Sharding Key都会在整个集群中均匀分布文档,我使用哪个字段作为Sharding Key并不重要。

对于查询是不同的。

哪个字段作为Sharding Key比较好?我在 MongoDB 文档中没有找到关于该主题的任何内容。

两个字段具有相同的范围和非常相似的基数数字,不会有任何差异。通常查询返回的文档数量很少(通常少于 20-30 个文档)。

在分片集群中,mongos 路由器根据存储在配置服务器上的可用分片键元数据确定读取或写入操作的目标分片。

For inserting either Sharding Key will distribute documents evenly throughout the cluster, there is does not matter which field I use as Sharding Key.

当您插入文档时,它将有一个分片键,文档将存储在指定的分片上。

Field(1) is usually part of the query filter condition, thus query would be processed usually on a single shard only.

分片键的主要目的是 (a) 在集群中的分片之间均匀分布数据,以及 (b) 能够以查询针对单个分片的方式查询数据。

对于以单个分片为目标的查询,分片键必须是查询过滤条件的一部分。 mongos 路由器将使用分片键定位单个分片。

如果分片键不是过滤条件的一部分,它将是一个分散-聚集操作(一个长 运行 查询)。重要的是,使用分片集合的应用程序最重要的查询操作必须能够使用分片键。

Field(2) is typically not part of the query filter condition, thus query would be processed over all shards and typically several shards will contribute to final query result.

当分片键不是查询过滤器的一部分时,操作将跨越多个分片(分散-聚集操作),这将是一个缓慢的 运行 操作。 mongos router将无法确定哪些分片有目标数据,将查询集群中的所有分片以return最终结果。

Which one is the better field to be used as Sharding Key?

可以断定Field(1)一定要作为shard key使用

查看有关分片键和选择分片键的文档@MongoDB docs on Shard Keys