当前位置: 首页 > 知识库问答 >
问题:

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

后易安
2023-03-14

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

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

和扫描操作:

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

这是基于性能和成本考虑的最佳选择。

共有3个答案

魏学智
2023-03-14

它类似于关系数据库。

Getquery如果在条件中使用主键,计算复杂度为log(n),因为大多数键结构是二叉树。

查询时,您必须扫描整个表,然后对每一行应用筛选器,以找到正确的结果。性能为O(n)。如果你的桌子很大,速度会慢得多。

简而言之,如果您知道主键,请尝试使用查询。只有扫描才适用于最坏的情况。

另外,考虑全局二级索引,以支持对不同键的不同类型的查询,从而实现性能目标

蓝鸿哲
2023-03-14

您将dynamodb表分区键/主键设置为customer\u country。如果使用查询,则必须在客户所在国进行查询操作。所有过滤器只能用于属于客户所在国家/地区的项目。

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

这里customer_country是分区键/主键,id是sort_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的扫描操作。

  • 宇文勇
    2023-03-14

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

    查询操作仅支持主键的相等运算符求值,但有条件(=,

    扫描操作通常速度较慢,成本较高,因为该操作必须遍历表中的每个项目才能获取您请求的项目。

    示例:

    Table: CustomerId, AccountType, Country, LastPurchase
    
    Primary Key: CustomerId + AccountType
    

    在本例中,您可以使用查询操作来获取:

    1. AccountType上具有条件筛选器的CustomerId

    需要使用扫描操作返回:

    1. 具有特定帐户类型的所有客户
    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]特定帐户类型的CustomerID上的条件筛选器
    3. [LSI]上次购买时带有条件筛选器的CustomerId
     类似资料:
    • 我有一个用例,我必须在Dynamo DB中返回表的所有元素。 假设我的表有一个分区键(列X),所有行中的值都相同,比如“monitor”和排序键(列Y),元素不同。 以下方法的执行时间是否会有任何差异,还是相同? 扫描整张桌子。 基于具有“监视器”的分区键查询数据。

    • 问题内容: 我的桌子上有十亿多条记录。为了提高性能,我将其划分为30个分区。最频繁的查询包含在where子句中,因此我决定在表上对表进行分区。 基本上,分区是通过以下方式创建的: 我运行了整个数据库,尤其是通过运行以下命令使它为该表的列收集了额外的统计信息: 但是,当我运行对列进行筛选的查询时,计划程序会显示它仍在扫描所有分区。设置为,所以这不是问题。 我怎样做才能使刨床有更好的计划?我是否还需要

    • 我已经在该表上创建了DynamoDB表和全局辅助索引。我需要从该表的GSI中获取所有数据。 有两种选择: 无筛选表达式的扫描操作 我需要找出哪一个性能更好,以便我开始我的实现。 我已经读了很多关于DynamoDB扫描和查询操作,但可以解决我的查询。 请帮我解决我的问题。 提前谢谢。 阿披实

    • 我正在尝试编写一个扫描器,以便每次\n被检测到,它会扫描那之后的行,直到一个新的\n出现。我第一次试过这样的东西。 它起作用,输出为 然而,当我尝试用扫描器(System.in)做同样的事情时,即使输入相同,它也不能以同样的方式工作 输出: 编辑:如果输入为 并立即输入提示符,那么Scanner.nextLine()是否就足够了?

    • 我们有一个设置,其中各种工作节点执行计算并更新DynamoDB表中的相对状态。该表充当工作节点活动的一种历史记录。看门狗节点需要定期扫描表,并构建一个表示工作节点及其作业的当前状态的对象。因此,我们的应用程序能够扫描表并按时间顺序检索数据(即按时间戳排序)是很重要的。表最终会太大,无法扫描到本地内存进行后期排序,所以我们扫描后无法排序。 从AWS留档读取主键: DynamoDB使用分区键值作为内部

    • 我正在使用DynamoDB,并通过将JSON传递给它来存储文档,所有这些都在Java中使用DynamoDBMapper类。 将数据放入表中已经足够简单了。还可以查询表中是否有可用的Hash或Range值。 但是我想用JSON文档对一个值进行扫描(我猜是这样)。我一直在四处寻找例子,但我找不到任何例子,或者至少在使用DynamoDBMapper方法做事时找不到。 那么我认为这是可以做到的,对吗?如果