在 Azure Cosmos DB 表中查找 table 的分区键
Partition key for a lookup table in Azure Cosmos DB Tables
我有一个非常简单的查找table我想从 Azure 函数调用。
架构非常简单:
Name | Value 1 | Value 2
名称将是唯一的,但值 1 和值 2 将不是。查找中没有其他数据 table.
对于 Azure Table,您需要一个分区键和一个行键。显然,rowkey 将是 Name
字段。
我究竟应该使用什么分区键?
现在,我正在使用常量,因为不会有大量数据(最多可能有几百行),但使用常量似乎与此相反。
此答案适用于所有 Cosmos DB 容器,包括表。
何时将 Cosmos DB 容器存储在单个分区中(使用常量作为分区键)?
- 如果您确定容器的数据大小始终保持在 10GB 以下。
- 如果您确定容器的吞吐量要求始终低于 10,000 RU/s(每秒 RU)。
如果上述任一条件不成立,或者如果您不确定未来数据大小的增长或吞吐量要求,那么根据以下指南使用分区键将允许容器扩展。
分区在 Cosmos DB 中的工作原理
Cosmos 将容器项目分组为一组 logical partitions based on the partition key. These logical partitions are then mapped to physical partitions。物理分区是 compute/storage 的单位,它构成了底层数据库基础设施。
您可以通过选择分区键来确定如何将数据拆分为逻辑分区。您无法控制逻辑分区如何映射到物理分区,Cosmos 会自动透明地处理这个问题。
将容器分布在大量物理分区上是 Cosmos 允许容器扩展到几乎无限大小和吞吐量的方式。
每个逻辑分区最多可以包含 10GB 的数据。未分区容器的最大吞吐量可以为 10,000 RU/s,这意味着每个逻辑分区的限制为 10,000 RU/s。
分配给您的容器的 RU/s 平均分配给托管容器数据的所有物理分区。例如,如果您的容器分配了 4,000 RU/s 并且其逻辑分区分布在 4 个物理分区中,那么每个物理分区将分配 1,000 RU/s,这也意味着如果您的其中一个物理分区在负载很重或 'hot' 下,它将速率限制为 1,000 RU/s,而不是 4,000。这就是为什么选择一个分区键非常重要,该分区键可以跨分区均匀地分布数据和数据访问。
如果您的容器位于单个逻辑分区中,它将始终映射到单个物理分区,并且容器的整个 RU/s 分配将始终可用。
所有 Cosmos DB 事务都限定在单个逻辑分区内,存储过程或触发器的执行也限定在单个逻辑分区内。
如何选择好的分区键
选择一个 partition key 将在逻辑分区之间均匀分布数据,这反过来将有助于确保数据在物理分区之间均匀映射。这将防止 'bottleneck' 或 'hot' 分区,这将导致速率限制并可能增加您的成本。
选择一个分区键作为大部分查询的过滤条件。通过提供分区键作为查询的过滤器,Cosmos 可以有效地将查询路由到正确的分区。如果未提供分区键,将导致 'fan out' 查询,该查询将发送到所有分区,这将增加您的 RU 成本并可能影响性能。如果您经常根据多个字段进行过滤,请参阅 this article 以获得指导。
总结
- 在 Cosmos DB 中对容器进行分区的主要目的是允许容器在存储和吞吐量方面进行扩展。
- 数据大小或吞吐量要求不会显着增长的小型容器可以使用单个分区。
- 大型容器,或预计会增加数据大小或吞吐量要求的容器,应使用精心选择的分区键进行分区。
- 分区键的选择至关重要,可能会显着影响您的扩展能力、RU 成本和查询性能。
我有一个非常简单的查找table我想从 Azure 函数调用。
架构非常简单:
Name | Value 1 | Value 2
名称将是唯一的,但值 1 和值 2 将不是。查找中没有其他数据 table.
对于 Azure Table,您需要一个分区键和一个行键。显然,rowkey 将是 Name
字段。
我究竟应该使用什么分区键?
现在,我正在使用常量,因为不会有大量数据(最多可能有几百行),但使用常量似乎与此相反。
此答案适用于所有 Cosmos DB 容器,包括表。
何时将 Cosmos DB 容器存储在单个分区中(使用常量作为分区键)?
- 如果您确定容器的数据大小始终保持在 10GB 以下。
- 如果您确定容器的吞吐量要求始终低于 10,000 RU/s(每秒 RU)。
如果上述任一条件不成立,或者如果您不确定未来数据大小的增长或吞吐量要求,那么根据以下指南使用分区键将允许容器扩展。
分区在 Cosmos DB 中的工作原理
Cosmos 将容器项目分组为一组 logical partitions based on the partition key. These logical partitions are then mapped to physical partitions。物理分区是 compute/storage 的单位,它构成了底层数据库基础设施。
您可以通过选择分区键来确定如何将数据拆分为逻辑分区。您无法控制逻辑分区如何映射到物理分区,Cosmos 会自动透明地处理这个问题。
将容器分布在大量物理分区上是 Cosmos 允许容器扩展到几乎无限大小和吞吐量的方式。
每个逻辑分区最多可以包含 10GB 的数据。未分区容器的最大吞吐量可以为 10,000 RU/s,这意味着每个逻辑分区的限制为 10,000 RU/s。
分配给您的容器的 RU/s 平均分配给托管容器数据的所有物理分区。例如,如果您的容器分配了 4,000 RU/s 并且其逻辑分区分布在 4 个物理分区中,那么每个物理分区将分配 1,000 RU/s,这也意味着如果您的其中一个物理分区在负载很重或 'hot' 下,它将速率限制为 1,000 RU/s,而不是 4,000。这就是为什么选择一个分区键非常重要,该分区键可以跨分区均匀地分布数据和数据访问。
如果您的容器位于单个逻辑分区中,它将始终映射到单个物理分区,并且容器的整个 RU/s 分配将始终可用。
所有 Cosmos DB 事务都限定在单个逻辑分区内,存储过程或触发器的执行也限定在单个逻辑分区内。
如何选择好的分区键
选择一个 partition key 将在逻辑分区之间均匀分布数据,这反过来将有助于确保数据在物理分区之间均匀映射。这将防止 'bottleneck' 或 'hot' 分区,这将导致速率限制并可能增加您的成本。
选择一个分区键作为大部分查询的过滤条件。通过提供分区键作为查询的过滤器,Cosmos 可以有效地将查询路由到正确的分区。如果未提供分区键,将导致 'fan out' 查询,该查询将发送到所有分区,这将增加您的 RU 成本并可能影响性能。如果您经常根据多个字段进行过滤,请参阅 this article 以获得指导。
总结
- 在 Cosmos DB 中对容器进行分区的主要目的是允许容器在存储和吞吐量方面进行扩展。
- 数据大小或吞吐量要求不会显着增长的小型容器可以使用单个分区。
- 大型容器,或预计会增加数据大小或吞吐量要求的容器,应使用精心选择的分区键进行分区。
- 分区键的选择至关重要,可能会显着影响您的扩展能力、RU 成本和查询性能。