繁体   English   中英

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

[英]What is the difference between scan and query in dynamodb? When use scan / query?

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

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

和扫描操作:

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

根据性能和成本,哪个最好?

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

查询操作仅支持对主键进行相等运算符评估,但对排序键有条件(=、<、<=、>、>=、Between、Begin)。

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

例子:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType

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

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

需要使用 Scan 操作来返回:

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

为了避免对经常使用的操作进行扫描操作,请创建本地二级索引 (LSI) 或全局二级索引 (GSI)。

例子:

Table: CustomerId, AccountType, Country, LastPurchase

Primary Key: CustomerId + AccountType
GSI: AccountType + CustomerId
LSI: CustomerId + LastPurchase

在此示例中,查询操作可以让您获得:

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

您将 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

------------------------------------
  • 如果您执行查询操作,它仅适用于customer_country值。 该值只能是等号运算符 (=)。

  • 因此,仅获取等于该分区键/主键值的项目。

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

注意:不要执行超出 RCU 的扫描操作。

它类似于关系数据库。

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

scan查询时,您必须扫描整个表,然后对每一row应用过滤器以找到正确的结果。 性能是O(n) 如果你的桌子很大,它会慢得多。

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

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

在性能方面,我认为为应用程序设计表以使用Query而不是Scan是一种很好的做法。 因为扫描操作总是在过滤出所需值之前扫描整个表,这意味着处理读取、写入和删除等数据操作需要更多的时间和空间。 更多信息请参考官方文档

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

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

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

您不能查询:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM