为什么我的 DynamoDB 扫描速度如此之快,仅使用 1 个预置读取容量单位?
Why is my DynamoDB scan so fast with only 1 provisioned read capacity unit?
我制作了一个包含 1346 个项目的 table,每个项目的大小都小于 4KB。我配置了 1 个读取容量单位,因此我预计平均每秒读取 1 个项目。但是,几乎立即对所有 1346 个项目进行简单扫描 returns。
我在这里错过了什么?
这很可能归结为 burst capacity,您可以在 300 秒的时间段内获得用于 burstable 操作(例如扫描整个 table)的容量。
这意味着如果您使用了所有这些配额,其他交互将受到影响,因为它们没有足够的可用容量。
您可以通过 CloudWatch 指标或在 DynamoDB 界面本身(通过“指标”选项卡)查看消耗量 WCU/RCU。
除了说“每个项目小于 4KB”之外,您没有给出条目的大小。少了多少?
1 个 RCU 将支持每秒 2 次最终一致读取最大 4KB 的项目。
换句话说,使用 1 个 RCU 和最终一致性读取,您每秒可以读取 8KB 的数据。
如果你的记录是 4KB,那么你得到 2records/sec
1KB,8 次/秒
512B,16/秒
256B,32/秒
所以已经提到的“突发”功能允许您使用 55 个 RCU。
但是您的记录较小,允许 55 个 RCU“几乎立即”return 数据
这里有两点对您有利 - 一个是 Scan
操作比您认为的小项目所需的 RCU 少得多。另一件事是“爆发能力”。我将尝试解释两者:
DynamoDB pricing page 表示“对于最大 4 KB 的项目,一个 RCU 每秒可以执行两个最终一致的读取请求。”。这表明即使该项目的大小为 10 个字节,也需要花费一半的 RCU 才能以最终一致性读取它。然而,尽管他们没有在任何地方说明这一点,但对于检索单个项目的 GetItem
操作,此成本仅 正确。在 Scan
或 Query
中,事实证明您没有为每件商品单独付款。相反,这些操作顺序扫描存储在磁盘上的数据,您需要为读取的数据量付费。如果您有 1000 个小项目并且 DynamoDB 必须从磁盘读取的总 大小为 80KB,您将支付 80KB/4KB/2,或 10 个 RCU,不是 500 个 RCU。
这就解释了为什么您阅读了 1346 个项目,并且只测量了 55 个 RCU,而不是 1346/2 = 673。
第二个对您有利的事情是 DynamoDB 具有“突发容量”功能,described here:
DynamoDB currently retains up to 5 minutes (300 seconds) of unused read and write capacity. During an occasional burst of read or write activity, these extra capacity units can be consumed quickly—even faster than the per-second provisioned throughput capacity that you've defined for your table.
因此,如果您的数据库在您发出请求前已存在 5 分钟,DynamoDB 会为您保存 300 个 RCU,您可以很快用完。由于 300 个 RCU 远远超过扫描所需的数量 (55),因此扫描进行得非常快,没有受到限制。
当您进行查询时,RCU 计数适用于读取的数据量 ,而不考虑 读取的项目数。因此,如果您的项目很小,比如每个项目只有几个字节,则可以在单个 4KB RCU 中轻松查询它们。
这在从 DynamoDB 读取许多项目时也特别有用。查询许多小项目比 BatchGetting 更便宜、更高效,这一点并不是很明显。
我制作了一个包含 1346 个项目的 table,每个项目的大小都小于 4KB。我配置了 1 个读取容量单位,因此我预计平均每秒读取 1 个项目。但是,几乎立即对所有 1346 个项目进行简单扫描 returns。
我在这里错过了什么?
这很可能归结为 burst capacity,您可以在 300 秒的时间段内获得用于 burstable 操作(例如扫描整个 table)的容量。
这意味着如果您使用了所有这些配额,其他交互将受到影响,因为它们没有足够的可用容量。
您可以通过 CloudWatch 指标或在 DynamoDB 界面本身(通过“指标”选项卡)查看消耗量 WCU/RCU。
除了说“每个项目小于 4KB”之外,您没有给出条目的大小。少了多少?
1 个 RCU 将支持每秒 2 次最终一致读取最大 4KB 的项目。
换句话说,使用 1 个 RCU 和最终一致性读取,您每秒可以读取 8KB 的数据。
如果你的记录是 4KB,那么你得到 2records/sec
1KB,8 次/秒
512B,16/秒
256B,32/秒
所以已经提到的“突发”功能允许您使用 55 个 RCU。 但是您的记录较小,允许 55 个 RCU“几乎立即”return 数据
这里有两点对您有利 - 一个是 Scan
操作比您认为的小项目所需的 RCU 少得多。另一件事是“爆发能力”。我将尝试解释两者:
DynamoDB pricing page 表示“对于最大 4 KB 的项目,一个 RCU 每秒可以执行两个最终一致的读取请求。”。这表明即使该项目的大小为 10 个字节,也需要花费一半的 RCU 才能以最终一致性读取它。然而,尽管他们没有在任何地方说明这一点,但对于检索单个项目的 GetItem
操作,此成本仅 正确。在 Scan
或 Query
中,事实证明您没有为每件商品单独付款。相反,这些操作顺序扫描存储在磁盘上的数据,您需要为读取的数据量付费。如果您有 1000 个小项目并且 DynamoDB 必须从磁盘读取的总 大小为 80KB,您将支付 80KB/4KB/2,或 10 个 RCU,不是 500 个 RCU。
这就解释了为什么您阅读了 1346 个项目,并且只测量了 55 个 RCU,而不是 1346/2 = 673。
第二个对您有利的事情是 DynamoDB 具有“突发容量”功能,described here:
DynamoDB currently retains up to 5 minutes (300 seconds) of unused read and write capacity. During an occasional burst of read or write activity, these extra capacity units can be consumed quickly—even faster than the per-second provisioned throughput capacity that you've defined for your table.
因此,如果您的数据库在您发出请求前已存在 5 分钟,DynamoDB 会为您保存 300 个 RCU,您可以很快用完。由于 300 个 RCU 远远超过扫描所需的数量 (55),因此扫描进行得非常快,没有受到限制。
当您进行查询时,RCU 计数适用于读取的数据量 ,而不考虑 读取的项目数。因此,如果您的项目很小,比如每个项目只有几个字节,则可以在单个 4KB RCU 中轻松查询它们。
这在从 DynamoDB 读取许多项目时也特别有用。查询许多小项目比 BatchGetting 更便宜、更高效,这一点并不是很明显。