Amazon dynamodb 我们能在dynamodb中避免扫描吗

Amazon dynamodb 我们能在dynamodb中避免扫描吗,amazon-dynamodb,dynamodb-queries,Amazon Dynamodb,Dynamodb Queries,我是noSQL数据建模新手,如果我的问题很琐碎,请原谅。我在dynamodb中发现的一个建议是,在查询时总是提供'PartitionId',否则,它将扫描整个表。但在某些情况下,我们可能需要列出我们的产品,例如在ecom网站上,我们需要在列表页面上列出我们的产品(带分页) 我们应该如何通过避免扫描或有效使用is来执行此列表?基本上,有: GetItem–从表中检索单个项。这是读取单个项目最有效的方法,因为它提供了对项目物理位置的直接访问 Query–检索具有特定分区键的所有项。在这些项中,您可

我是noSQL数据建模新手,如果我的问题很琐碎,请原谅。我在dynamodb中发现的一个建议是,在查询时总是提供'PartitionId',否则,它将扫描整个表。但在某些情况下,我们可能需要列出我们的产品,例如在ecom网站上,我们需要在列表页面上列出我们的产品(带分页)

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

基本上,有:

  • GetItem
    –从表中检索单个项。这是读取单个项目最有效的方法,因为它提供了对项目物理位置的直接访问
  • Query
    –检索具有特定分区键的所有项。在这些项中,您可以对排序键应用条件,并仅检索数据的子集。查询提供了对存储数据的分区的快速、高效访问
  • Scan
    –检索指定表中的所有项目。(此操作不应用于大型表,因为它会消耗大量系统资源
就是这样。正如你所看到的,你应该总是喜欢
GetItem
BatchGetItem
)而不是
Query
Query
-而不是
Scan

如果向数据中添加了,则可以使用查询。例如,可以使用类别作为散列键,使用产品名称作为排序键,以便显示特定类别的项目的页面可以使用该类别和产品名称进行查询。但这种设计是脆弱的,因为您可能需要其他页面的其他键,例如,您可能需要供应商+price查询用户是否在寻找特定的移动电话。这里可以提供帮助,但他们有自己的tradeof和

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

我想说的是,DynamoDB不适合多种工作负载。可能,它也不适合您的情况。请将其视为一个丰富的键值(key-to-object)存储,而不是一个“经典”的RDBMS,在这里索引成本更低,限制更少,并且为开发人员提供了丰富的查询功能

有一个描述DynamoDB潜在问题的文档,请看。它包含一个很棒的决策树,指导您完成DynamoDB论证。我将它粘贴在这里,但请注意,原始作者是

值得一读

最后,查看关于DynamoDB用例和问题的其他信息


顺便说一句,扫描没有什么犯罪行为(实际上我在我的一个项目中每天按计划扫描一次),但这是一个例外情况,我对在这种情况下使用DynamoDB的决定感到遗憾。它在速度、资金、支持和“肮脏”方面都没有效率.我必须在工作前增加容量,工作后减少容量,但这是另一回事…

这是一个非常广泛的问题。有很多方法可以做到这一点。这完全取决于您的表设计和索引的有效使用。起初,它看起来很像只有单键的键值存储,但有很多方法可以改进我的建议阅读了10次最佳实践:)我做了+1个很好的解释,这不仅适用于dynamodb,也适用于其他nosql(documentdb)。若您需要显示来自多个碎片的数据(当未提供分区键时),它总是会导致扫描。这是否意味着,在列出多个项目时,我们应该形成不同的策略。例如,blog就是使用nosql的一个很好的例子。所有评论,比如ect(属于博客)都可以一起存储在一个文档中(在一些nosql中)。但是如何显示博客列表(只有博客和标题)?