在dynamodb中扫描和查询有什么区别?什么时候使用扫描/查询?

sam*_*son 50 amazon-dynamodb

DynamoDb文档中指定的查询操作:

查询操作仅搜索主键属性值,并支持关键属性值上的比较运算符子集,以优化搜索过程.

和扫描操作:

扫描操作扫描整个表.您可以指定过滤器以应用于结果,以在完整扫描后优化返回给您的值.

哪种情况最好基于性能和成本考虑因素.

OK2*_*200 31

你有dynamodb表分区键/主键作为customer_country.如果使用查询,customer_country则是进行查询操作的必填字段.所有过滤器只能是属于的项目customer_country.

如果执行表扫描,将在所有分区键/主键上执行过滤器.首先,它从表中获取后获取所有数据并应用过滤器.

例如:

customer_country分区键/主键 ,idsort_key

-----------------------------------

customer_country | name   | id

-----------------------------------
VV               | Tom    | 1

VV               | Jack   | 2

VV               | Mary   | 4

BB               | Nancy  | 5

BB               | Lom    | 6

BB               | XX     | 7

CC               | YY     | 8

CC               | ZZ     | 9

------------------------------------
Run Code Online (Sandbox Code Playgroud)
  • 如果执行查询操作,则仅适用于customer_country值.该值应仅等于operator(=).

  • 因此,仅获取与该分区键/主键值相等的项.

  • 如果执行扫描操作,它将获取该表中的所有项目,并在获取该数据后过滤掉数据.

注意:请勿执行超出RCU的扫描操作.

  • @ AlikElzin-kilaka资料来源:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-query-scan.html (2认同)

Kin*_*man 29

创建Dynamodb表时,请选择"主键和本地二级索引"(LSI),以便"查询"操作返回所需的项目.

查询操作仅支持主键的相等运算符评估,但在排序键上有条件(=,<,<=,>,> =,Between,Begin).

扫描操作通常较慢且更昂贵,因为操作必须遍历表中的每个项目以获取您请求的项目.

例:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType
Run Code Online (Sandbox Code Playgroud)

在此示例中,您可以使用Query操作来获取:

  1. CustomerId上有AccountType的条件过滤器

需要使用扫描操作返回:

  1. 具有特定AccountType的所有客户
  2. 基于Country的条件过滤器的项目,即来自USA的所有客户
  3. 基于LastPurchase的条件过滤器的项目,即在上个月进行购买的所有客户

避免对常用操作进行扫描操作,创建本地二级索引(LSI)或全局二级索引(GSI).

例:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType
GSI: AccountType + CustomerId
LSI: CustomerId + LastPurchase
Run Code Online (Sandbox Code Playgroud)

在此示例中,Query操作可以允许您获取:

  1. CustomerId上有AccountType的条件过滤器
  2. [GSI]针对特定AccountType的CustomerIds的条件筛选器
  3. [LSI]具有LastPurchase条件过滤器的CustomerId


Ope*_*oip 10

查询比扫描好得多 - 性能明智。scan,顾名思义,将扫描整个表。但是您必须清楚地了解表键、排序键、索引和相关排序索引,才能知道您可以使用 Query。如果您使用以下方法过滤查询:

  • 钥匙
  • 键和键排序
  • 指数
  • 索引及其相关的排序键

使用查询!否则使用 scan ,它可以更灵活地过滤哪些列。

您不能查询:

  • 过滤器中超过 2 个字段(例如键、排序和索引)
  • 仅排序键(主键或索引)
  • 常规字段(不是键、索引或排序)
  • 混合索引和排序(索引 1 与索引 2 的排序)\
  • ...

一个很好的解释:https : //medium.com/@amos.shahar/dynamodb-query-vs-scan-sql-syntax-and-join-tables-part-1-371288a7cb8f


Joe*_*ang 10

它与关系数据库中的类似。

query你在where条件下使用主键,计算复杂度是log(n)因为大多数键结构是二叉树。

scan查询你要扫描整个表,然后应用在每一个过滤器row,以找到合适的结果。表现是O(n)。如果你的桌子很大,它会慢得多。

简而言之,query如果您知道主键,请尝试使用。只scan针对最坏的情况。

另外,考虑使用全局二级索引来支持对不同键的不同类型的查询以获得性能目标


Liu*_*hen 6

在性能方面,我认为设计用于Query代替的应用程序的表是一种很好的做法Scan.因为扫描操作总是在筛选出所需的值之前扫描整个表,这意味着处理数据操作(如读取,写入和删除)需要更多的时间和空间.有关更多信息,请参阅官方文档