【问题标题】:get the list of partition keys in a dynamodb with boto3使用 boto3 获取 dynamodb 中的分区键列表
【发布时间】:2023-01-25 18:58:35
【问题描述】:

实际上,我正在使用 scan 并在每个项目中获取分区键,但这确实效率不高,我的 dynamodb 太大而且需要太多时间。

有没有办法query只有分区键,这样我们就有了一种优化的廉价方法来在 python 中使用 boto3 获取 dynamoDB 的所有分区键?

我的确切目标是从我的 dynamoDB 的 50 个最新元素中获取信息。 我的 dynamoDB 在 form_data 列中有很多信息,所以首先,我想在一个廉价的调用中获得 50 个最新的 creation_file_date 的 ID,这样之后我就可以对每个元素进行优化调用。

【问题讨论】:

  • 不,那里没有。您必须在数据库中为这种访问模式设计一个解决方案。如果您向我们提供有关您要检索的实体的更多信息,我们可以帮助您进行设计。
  • @desoss 我明确了我的个人问题以提供更多背景信息。但我认为第一个问题真的很普遍。

标签: python amazon-dynamodb boto3


【解决方案1】:

扫描

正如您提到的,获取密钥列表的唯一方法是通过Scan。为了减少延迟,您可以使用ParallelScan,但是对于您的用例来说它仍然效率很低。

全球二级索引

我的建议是使用 GSI 为您提供 50 个最新元素的能力。在我的示例中,我假设您的峰值写入吞吐量永远不会超过 1000 WCU,如果超过,您将需要写入分片索引属性。

创建一个索引,其中静态值作为分区键,creation_file_date 作为排序键。

基表

creation_file_date clients data gsi_pk
CR 19/01/2023 18:00 1
CR 19/01/2023 19:00 1
CR 19/01/2023 20:00 1
CR 18/01/2023 21:00 1

全球二级索引

gsi_pk creation_file_date clients data
1 CR 18/01/2023 21:00
1 CR 19/01/2023 18:00
1 CR 19/01/2023 19:00
1 CR 19/01/2023 20:00

通过 creation_file_date 获取最后 50 个元素

aws dynamodb query 
--table-name test1 
--index-name test-index 
--key-condition-expression "gsi_pk = :id" 
--expression-attribute-values  '{":id":{"N":"1"}' 
--scan-index-forward false 
--limit 50 
--return-consumed-capacity TOTAL

【讨论】:

    【解决方案2】:

    使用您当前的数据库设计,您别无选择扫描. 但不要使用扫描!让我们一起检查如何更改表格设计。

    使用 DynamoDB,您必须提前了解访问模式来设计数据库。需要一段时间才能全面了解它,特别是如果您来自关系数据库。但是一旦你意识到这一点,它就会令人兴奋。

    亚历克斯德布里写道:

    DynamoDB API 可能看起来很有限,但它是有意为之的。了解 DynamoDB 的关键点是它不会让您编写错误的查询。我所说的“错误查询”是指随着扩展性能会下降的查询。

    首先要了解的重要一点是,您的访问模式应该围绕您的主键(分区键和排序键)构建。

    请记住询问扫描将从您的表或二级索引中读取最多 1MB 的数据。在考虑任何过滤器表达式之前应用此 1 MB 限制。

    我有一些初步的建议给你。 查看索引重载和二级索引。此外,为主键使用不同的日期格式。这样您就可以利用字符串排序,例如“yyyy/MM/dd hh:mm:ss.sss”。

    与您的问题相关,我建议您创建一个稀疏二级索引,您将在其中存储前 50 个项目。 因此,您应该在您的项目中添加一个字段,例如,属于最后50.

    看看这里的稀疏二级索引示例:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-indexes-general-sparse-indexes.html

    每当您执行插入操作时,您都可以利用事务写入项目运算符以插入新项目并更新稀疏二级索引的最后一项。 在这里你可以找到一些详细的解释事务写入项目: https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html

    使用此解决方案,您无需付费即可访问最近 50 件商品

    (其他建议,我会将分区键重命名为 PK,并添加一个名为 SK 的排序键。我将使用此 PK -> CR#yyyy/MM/dd 和此 SK-> yyyy/MM/dd hh 保存 CR :mm:ss.sss)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-20
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      相关资源
      最近更新 更多