对于我的应用程序,我需要分割一个相当大的集合,整个集合将包含应用程序。5000亿份文件。
我有两个潜在的字段可以用作切分键:
对于插入--分片键将在整个集群中均匀地分发文档,我使用哪个字段作为切分键并不重要。
对于查询,则不同。
哪个字段更适合用作切分键?我在MongoDB文档中没有找到关于这个主题的任何东西。
这两个字段都有相同的范围和非常相似的基数数字,不会有任何差别。通常,查询返回的文档数量非常少(通常少于20-30个文档)。
发布于 2020-01-25 02:28:33
在分片集群中,mongos路由器根据存储在配置服务器上的可用碎片密钥元数据来确定读或写操作的目标是哪个碎片。
为了插入任意一个切分键将文档均匀分布在整个集群中,我使用哪个字段作为切分键并不重要。
当您插入一个文档时,它将有一个碎片键,并且该文档将存储在指定的碎片上。
字段(1)通常是查询筛选条件的一部分,因此查询通常只在单个碎片上处理。
shard键的主要用途是(a)在集群中的碎片之间均匀分布数据,(b)能够以查询针对单个碎片的方式查询数据。
要使查询以单个碎片为目标,碎片键必须是查询的筛选条件的一部分。mongos路由器将使用碎片键锁定单个碎片。
如果shard键不是筛选条件的一部分,它将是一个分散收集操作(一个长时间运行的查询)。重要的是,使用切分集合的应用程序的最重要的查询操作必须能够使用碎片键。
字段(2)通常不是查询筛选条件的一部分,因此查询将对所有碎片进行处理,并且通常有几个碎片将有助于最终的查询结果。
当shard键不是查询筛选器的一部分时,操作将跨越多个碎片(一个分散收集操作),并且它将是一个运行缓慢的操作。mongos路由器将无法确定哪些碎片具有目标数据,集群中的所有碎片都将被查询以返回最终结果。
哪个字段更适合用作切分键?
可以得出结论,字段(1)必须用作碎片密钥。
请参阅关于碎片键的文档,并选择一个shard键@ 碎片钥匙上的MongoDB文档。
https://stackoverflow.com/questions/59904327
复制相似问题