我们可以避免在dynamodb中扫描吗

时间:2018-12-01 08:50:42

标签: amazon-dynamodb dynamodb-queries

我是noSQL数据建模的新手,所以如果我的问题不重要,请原谅。我在dynamodb中发现的一个建议是在查询时始终提供“ PartitionId”,否则它将扫描整个表。但是在某些情况下,我们需要列出我们的商品,例如在ecom网站上,我们需要在列表页面上列出我们的产品(带有分页)。

我们应如何通过避免扫描或有效使用来执行此列表?

1 个答案:

答案 0 :(得分:2)

基本上,有three ways of reading data from DynamoDB

  • GetItem –从表中检索单个项目。这是读取单个项目的最有效方法,因为它可以直接访问该项目的物理位置。
  • Query –检索具有特定分区键的所有项目。在这些项目中,您可以将条件应用于排序键,并且仅检索数据的子集。通过查询,可以快速,有效地访问存储数据的分区。
  • Scan –检索指定表中的所有项目。 (此操作不应与大表一起使用,因为它会消耗大量系统资源。

就是这样。如您所见,您应该始终偏爱GetItem的{​​{1}}(BatchGetItem)和Query的{​​{1}} —。{p>

如果在数据中添加sort key,则可以使用查询。即您可以将类别用作哈希键,将产品名称用作排序键,以便显示特定类别项目的页面可以使用按该类别和产品名称的查询。但是这种设计很脆弱,因为您可能需要其他页面的其他键,例如,如果用户正在寻找特定的手机,则可能需要供应商+价格查询。 Indexes可以在这里提供帮助,但是它们具有自己的取舍和limitations

此外,在query / scan操作完成之后但在获得结果之前,将应用通过任意表达式进行过滤,因此您需要为整个查询/扫描付费。从字面上看,就像您自己在应用程序中而不是在数据库端过滤数据一样。

我要说的是DynamoDB不适用于多种工作负载。可能也不适合您的情况。可以将它看作是丰富的键值(对象到键)存储,而不是“经典” RDBMS,后者的索引成本更低,限制更少,并且为开发人员提供了丰富的查询功能。

good article描述了DynamoDB的潜在问题,请看一下。它包含一个很棒的决策树,可以指导您完成DynamoDB的论证。我将其粘贴在此处,但是请注意,原始作者是Forrest Brazeal

enter image description here

Another article值得阅读。

最后,查看this short answer关于DynamoDB用例和问题的信息。

P.S。进行扫描没有任何犯罪(而且我实际上在我的一个项目中每天按计划进行一次扫描),但这是一个例外情况,对于在这种情况下使用DynamoDB的决定,我感到遗憾。在速度,金钱,支持和“肮脏”方面,它效率不高。我不得不在工作之前增加容量,然后在工作之后减少容量,但这是另一个故事……