MongoDB-使用三个值的复合分片键

时间:2013-12-09 01:44:49

标签: mongodb sharding mongodb-query cardinality

我正在创建一个使用MongoDB存储JSON对象的集合。我被困在Sharding部分。 我有一个案例ID,客户ID和集合中每个记录的位置

案例ID是一个10位数字(只有数字,没有字母)。

CustomerID是客户名称和案例ID的组合。

该位置是一个2dsphere值,我期待一个不同的值的位置。

除此之外,我还有记录的客户名称和案例描述。 我的所有搜索查询都有案例ID,客户ID或位置的搜索条件。

鉴于这种情况,我可以基于所有这三个值(CaseID,CustomerID和位置)创建复合键。我相信这样可以提供高基数并且易于检索记录。

任何人都可以建议我,如果这是一个很好的方法,因为我没有找到包含三个值的复合分片键。

感谢您的时间,如果您需要任何信息,请告知我们

1 个答案:

答案 0 :(得分:13)

首先要考虑的是是否需要进行分片。如果您的数据集适合单个服务器,则从非部署部署开始。如果需要,稍后可以轻松无缝地将其转换为分片群集。

假设您确实需要进行分片,您选择的分片键应基于以下标准:

  1. 基数 - 选择不限于少量可能值的分片键,以便MongoDB可以在群集中的分片之间均匀分布数据。
  2. 写入分发 - 选择一个分片键,在群集中的分片之间均匀分配写入操作,以防止任何单个分片成为瓶颈。
  3. 查询隔离 - 选择最常见查询中包含的分片键,以便这些查询可以有效地路由到保存数据的单个目标分片,而不是广播到所有碎片。
  4. 您提到所有查询都包含案例ID,客户ID或位置,但未描述您的用例。举个例子,我们假设您最常见的查询是:

    • 检索客户案例
    • 检索给定客户的所有案例

    在这种情况下,一个好的分片键候选者将是该命令(name,caseID)上的复合分片键(以及相应的复合索引)。考虑这是否符合上述标准:

    1. 基数 - 每个文档对于分片键具有不同的值,因此基数非常好。
    2. 编写分发 - 所有客户的案例分布在所有分片中。
    3. 查询隔离:
      • 要检索特定案例,名称和caseID应包含在查询中。此查询将路由到包含文档的特定分片。
      • 要检索给定客户的所有案例,请在查询中包含姓名。因此,此查询包含分片键的前缀,因此也将有效地路由到保存与查询匹配的文档的特定分片。
    4. 请注意,您不能将地理空间索引用作分片键索引的一部分(如文档here所述)。但是,如果使用分片键的其他字段,则仍可以在分片集合上创建和使用地理空间索引。例如,使用上面的分片键:

      • 包含客户名称的地理空间查询将定位到相关分片。
      • 不包含客户名称的地理空间查询将广播到所有分片('分散/聚集'查询)。

      可以找到有关分片键注意事项的其他文档here