如何从DynamoDB表中删除大量的项目?
如何从DynamoDB表中删除大量的项目?
我有一个DynamoDB表,想要删除大量的项。我在stackoverflow上找到了一个类似问题的答案,其中的方法是扫描整个表以收集所有相关的项,然后批量删除它们。但是在我的情况下,项太多了,无法放入内存中。
在这种情况下可能有哪些解决方案呢?
- 使用lastEvaluatedKey扫描表,并每次删除'x'个项(比如25或100个)。这只需要一次扫描,但这是一个有效的解决方案吗?删除项是否对下一次迭代的lastEvaluatedKey有任何影响?
- 多次扫描表,并删除'x'个项,而不使用lastEvaluatedKey。这将需要多次全表扫描。这肯定是一个有效的解决方案,但我想要避免它。
如何从DynamoDB表中删除大量项目?
有时候,我们需要从DynamoDB表中删除大量项目。但是,如果我们一次删除太多项目,可能会导致请求超时或资源不足的错误。因此,我们需要找到一种方法来有效地删除大量项目。
解决方法如下:
选项1应该可以工作。您将LastEvaluatedKey
作为ExclusiveStartKey
传递。
请注意单词“Exclusive”,扫描将从大于作为ExclusiveStartKey
传递的值的下一个键开始。
您甚至可以在并行扫描中使用此选项。根据文档:
在并行扫描中,包括ExclusiveStartKey的扫描请求必须指定其上一个扫描返回的LastEvaluatedKey的相应值的相同段。
在继续之前,考虑设置Time-To-Live (TTL)。
这将允许DynamoDB自动为您删除项目。最好的部分是,这些删除不会产生任何费用!与您当前计划相比,您需要支付读取项目的费用,然后再支付删除费用。
如果在删除过程中插入了具有较低键的项目,则不会被删除。
如果迭代顺序仅基于键比较,则选项1应该在我的情况下(只删除)起作用,就像您所说的那样。我会测试并查看它是否有效。当您说较低/较高键时,比较标准是什么?我知道这并不重要,只是好奇,因为我在文档中找不到任何信息。
键比较取决于键属性的数据类型,例如数字、字符串、二进制。有关DynamoDB如何进行比较的文档,请参见数据类型。
通过以上整理,我们可以了解到,当需要从DynamoDB表中删除大量项目时,可以使用选项1,并传递上一次请求返回的LastEvaluatedKey
作为ExclusiveStartKey
来进行删除操作。此外,我们还可以考虑设置TTL来自动删除项目。