我想知道以下场景中分区partitionkey
集合中的DocumentDB
:
C
都包含两个字段:a
和b
C
和a
作为查找条件(在sql查询b
子句中使用它们),必须快速查找文档where
。我认为有必要以某种方式指定两个字段来完成目标2.有没有什么方法可以指定字段a
和b
作为我的集合的分区键?
如果没有,是否有其他解决方案?
答案 0 :(得分:1)
我认为你可能在这里混淆了两个概念 - 分区和索引。
为了支持使用a和b作为标准的快速检索,您需要将这些文档编入索引。幸运的是,DocumentDB已经为您编制索引,因此您可以获得快速的性能。见https://docs.microsoft.com/en-us/azure/documentdb/documentdb-indexing
分区是一种在多个集合中分割数据(如果有很多数据)的方法,以便处理超过单个集合限制的数据。指定分区键时,具有相同键的文档将转到同一个集合。见https://docs.microsoft.com/en-us/azure/documentdb/documentdb-partition-data
那么在选择分区键时应该考虑什么逻辑?根据经验,您希望在查询中出现的文档可以在同一个集合中找到。因此,例如,如果您执行大量返回给定userId的所有文档的查询,则可能需要按用户ID进行分区。
答案 1 :(得分:1)
有两种方法可以做到这一点:
a
或b
(接收方)作为分区键。由于DocumentDB会自动为所有属性编制索引,因此将对单个分区执行查询。a
和b
的连接值(例如from:a@b.com;to:c@d.com
,并将其用作分区键。然后在执行查询时,将新属性包含为过滤器在你的查询中。第二种方法比a
和b
的查询效率更高。如果您只有a
或两者(a
和b
)混合查询,那么第一种方法会更好,因为两个查询都将针对单个分区。
但正如其他人所提到的,使用任何一种方法,或者如果你甚至选择了不同的分区密钥(如事务ID),您将获得低延迟查询响应。但对于在a
和b
上进行过滤的查询工作负载,上述方法将是最佳选择。