【发布时间】:2019-09-06 06:02:58
【问题描述】:
我有一个用例,我必须返回 Dynamo DB 中表的所有元素。
假设我的表有一个分区键(X 列),在所有行中都具有相同的值,比如“监视器”和排序键(Y 列)具有不同的元素。
以下方法的执行时间会有所不同还是相同?
- 扫描整个表。
- 根据具有“monitor”的分区键查询数据。
【问题讨论】:
标签: amazon-dynamodb dynamodb-queries
我有一个用例,我必须返回 Dynamo DB 中表的所有元素。
假设我的表有一个分区键(X 列),在所有行中都具有相同的值,比如“监视器”和排序键(Y 列)具有不同的元素。
以下方法的执行时间会有所不同还是相同?
【问题讨论】:
标签: amazon-dynamodb dynamodb-queries
您应该使用parallell scans 概念。基本上,您一次对表的不同部分进行多次扫描。但请注意更高的 RCU 使用率。
【讨论】:
尽量避免使用扫描。
扫描将从表中获取所有行,您还必须使用分页来遍历所有行。更像是select * from table;的sql操作。
如果要根据分区键获取所有行,请使用查询。如果你知道你想要结果的分区键,你应该使用查询,因为它会使用索引来获取仅具有特定分区键的行
【讨论】:
据我所知,在您描述的特定情况下,scan 会稍微慢一些(尤其是在第一次响应中)。这是假设您不进行任何过滤(即,FilterExpression 为空)。
DynamoDB 可能会存储大量数据。我所说的“巨大”是指“超过任何机器的 RAM 容量”。如果您需要“返回表的所有元素”,您应该问自己:如果该表增长到所有元素都不再适合内存会发生什么?您现在不必处理此问题(我相信到目前为止该表相当小),但您确实需要记住返回此代码并对其进行修复以解决此问题的可能性。
如果我处于你的位置,我会问自己的问题:
(1) 我能否以某种方式限制我需要阅读的项目数量(例如, 只读取前 1000 个项目)?
(2) 这个信息如何(列表 项目)使用?它是否被发送回运行在一个内部的 JS 应用程序 向用户显示它的浏览器?如果答案是肯定的,那怎么办 用户会处理大量的项目吗?
(3) 你可以一次处理一个(或一次处理 10 个或 100 个)吗?如果答案是肯定的,那么您只需要在内存中存储一个(或 10 或 100 个)项目,而不是整个项目列表
一般来说,在 DDB 中,scan 操作的使用如 (3) 中所述:一次读取一个(或多个)项目,进行一些处理,然后继续处理下一个项目。
【讨论】: