如何在 DynamoDB 查询中计算消耗的读取容量单位

How are consumed read capacity units calculated in DynamoDB query

我看过亚马逊的页面,了解到 1 个 RCU 是一个 4KB 的项目。

如果我有一个包含 50 个项目的 table,我了解到扫描将读取完整的 50 个项目并使用 50 个 RCU。但是假设我做了一个查询,我的 table 是 10 x 5,它还会使用 50 RCU 吗?

扫描包含 50 个项目的 table 仅当 50 个项目的总大小加起来等于 200KB(对于强一致性读取,或 400KB 对于最终一致性读取)时,才会消耗 50 个 RCU。大多数项目都没有那么大,因此 50 个项目通常只需要大约 10KB 的存储空间,这意味着对 table 的 50 个项目进行全面扫描,并最终保持一致,只需花费大约 3 个 RCU。

消耗的读取容量单位 (RCU) 取决于多种因素:

如果使用 GetItem 操作读取项目,则根据项目大小(即 200B 项目和3KB 的项目每个将消耗 1RCU,而 5KB 的项目将消耗 2RCU)

如果您使用 QueryScan 操作读取多个项目,则消耗的容量取决于项目的累积大小 accessed(即使是使用过滤器时从查询或扫描中过滤掉的项目,您也会被收取费用)。因此,如果您的查询或扫描访问 10 个项目,每个项目的大小约为 200 字节,那么它将仅消耗 1 个 RCU。如果您阅读 10 条,但每条大小约为 5KB,则总消耗容量将为 13 RCU(50KB / 4KB = 12.5,四舍五入,为 13)

此外,如果您执行最终一致性读取,那么您可以将每个容量单位的大小加倍。所以读取 10 个 5KB 项目只需要 7 个 RCU。

您可以在此处阅读 more about throughput capacity

有几点需要注意:

  • 单个项目可能大到 400KB,因此读取一个项目可能会消耗多达 100 个 RCU。
  • 计算项目大小时,属性名称也计入项目大小,而不仅仅是它们的值!

Query—Reads multiple items that have the same partition key value. All items returned are treated as a single read operation, where DynamoDB computes the total size of all items and then rounds up to the next 4 KB boundary. For example, suppose your query returns 10 items whose combined size is 40.8 KB. DynamoDB rounds the item size for the operation to 44 KB. If a query returns 1500 items of 64 bytes each, the cumulative size is 96 KB.

参考:https://docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguide/ProvisionedThroughput.html

Smoke 使用复合主键和配置容量以及最终一致性对以下条目进行了测试:

  • 条目#1(大小 ~ 200B): 散列键 = foo, 范围键 = foobar

  • 条目 #2(大小 ~ 5KB): 散列键 = foo, 范围键 = foojar

对 table 的查询和报告的 RCU 消耗:

  1. 散列键等于“foo”和范围键BEGINS_WITH“foo”--> 返回的条目和 1 个消耗的 RCU
  2. 散列键等于“foo”和范围键BEGINS_WITH“foobar”--> 返回大小为 ~ 200B 的条目并消耗 0.5 个 RCU
  3. 散列键等于“foo”和范围键BEGINS_WITH“fooojar”--> 返回大小为 ~ 5KB 的条目并消耗 1 个 RCU

正如已经推测的那样,这表明访问的项目是与整个复合键匹配的项目,而不仅仅是哈希键。

相比之下,如果您只是通过散列键查询项目,然后过滤到单个项目 --> 它会访问分区中的所有项目并仍然消耗 1 个 RCU。