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

标签 amazon-dynamodb dynamodb-queries

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

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

最佳答案

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

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

  • 就是这样。如您所见,您应该总是更喜欢 GetItem ( BatchGetItem ) 到 Query , 和 Query — 至 Scan .

    如果添加 sort key,则可以使用查询到您的数据。 IE。您可以使用类别作为散列键和产品名称作为排序键,以便显示特定类别项目的页面可以使用该类别和产品名称进行查询。但是这种设计是脆弱的,因为您可能需要其他页面的其他键,例如,如果用户寻找特定的手机,您可能需要供应商 + 价格查询。 Indexes可以在这里提供帮助,但他们有自己的权衡和limitations .

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

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

    有一个good article描述 DynamoDB 的潜在问题,请看一看。它包含一个很棒的决策树,可指导您完成 DynamoDB 论证。我把它贴在这里,但请注意,原作者是 Forrest Brazeal .

    enter image description here

    Another article值得一读。

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

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

    关于amazon-dynamodb - 我们可以避免在 dynamodb 中扫描吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53569190/

    相关文章:

    javascript - DynamoDB 索引查询包括

    python - 将 Json 放入 DynamoDB 项目

    amazon-dynamodb - 如何使用 CloudFormation 在 DynamoDB 上启用静态加密

    amazon-dynamodb - DynamoDB : What difference does it make whether I set an attribute to "NULL": "true" or just omit it?

    amazon-web-services - go and dynamo 从表中的字段和字段不为空/字段不为空的表中获取数据

    Golang 根据属性获取项目 手机 dynamodb

    amazon-web-services - 在 DynamoDB 中批量查询 GSI?

    node.js - AWS SAM 本地 + DynamoDB 本地

    node.js - 您如何对写入/读取 dynamodb 并通过 AWS API 网关端点调用的 NodeJs Lambda 函数进行单元测试?

    amazon-dynamodb - DynamoDB boto3 : How to query if a key has some value