UniqueId或UniqueId的子串作为Cosmos DB中的分区键?

时间:2018-06-19 02:10:29

标签: azure-cosmosdb partitioning

我们有一个Cosmos DB Collection,包含大约100万个包含用户信息的文档。每天添加或更新的次数不多。但是,我们需要非常高的读取吞吐量。

大多数查询都基于UserId。 UserId属性是一个由运行数和校验位组成的数值。

基于官方文档

有些人可能认为两者,完整的UserId和UserId的子字符串(假设最后4位数字)可以构成一个好的分区键,即

  • 均匀分配请求和存储
  • 查询可以“有效”吗?路由到相应的分区
  • 提供高基数

将来, 可能 每个UserId都有多个文档,但假设不超过5个。

我的理解是,还需要在分区数和每个分区的文档数之间取得平衡。因此,在100万个分区中每个分区具有1个文档也是不理想的。但是,在此SO thread上,Microsoft工程师建议使用完整的唯一标识符作为分区键。 (值得注意的是,我们的情况略有不同,因为这里UserId是一个运行数字而不是随机GUID)。此外,在this blog post的注释中,还建议使用ID作为分区键。

所以,考虑到: a)此集合主要用于读取操作, b)我们将拥有1到2百万个UserIds, c)每个UserId我们的文档不会超过5个, d)我们不要求跨多个用户的SP或交易。 什么分区键会更高效?

  1. Full UserId
  2. UserId的子字符串(例如,最后4位数字)

1 个答案:

答案 0 :(得分:1)

根据@RafatSarosh的评论和进一步的研究,我了解到拥有数百万个分区和每个分区1个文档并不是一个坏习惯,我们可以依靠Cosmos DB查询执行优化。

我们将使用userId作为分区键。

HTH