首页 > 解决方案 > dynamodb查询中的属性和键有什么区别

问题描述

假设我将“名称”作为主键,将“时间戳”作为排序键。我意识到我可以同时使用 Attr("timestamp") 和 Key("timestamp") 进行查询。

我还可以使用 filterexpression(Attr("account").eq("john")) 以及使用 keyconditionexpression=Key("account").eq("john") 的查询进行表扫描,这给了我相同的结果.

所以我有两个问题。一般来说,如果我有相同的条件,使用扫描或查询会有所不同吗?在进行查询时,具有与任何其他数字属性不同的排序键有什么意义?

标签: databaseamazon-dynamodb

解决方案


虽然 a Scanwith aFilterExpression和 a QuerywithKeyConditionExpression可能返回相同的结果,但在执行方式、性能和成本方面存在很大差异。在您的情况下,强烈建议使用 a Query,而不是 a Scan。让我解释:

AScan总是扫描整个表。它可能会根据 过滤掉一些东西FilterExpression,但是 DynamoDB 仍然需要读取表中的所有项目,并且您将为这些读取付费。以非常有选择性的方式进行扫描FilterExpression(仅返回表的一小部分)几乎总是一个坏主意。相对于您尝试读取的数据量,它会非常慢并且花费很多。

另一方面,Query可以有效地直接跳转到您要求的分区(KeyConditionExpression只能指定单个分区键),并且在该分区内,读取您在 中指定的排序键范围KeyConditionExpression。这样做所花费的时间以及您的成本只会与您实际阅读的项目数量成正比——即使这些只是整个表格的一小部分。

Query由于 DynamoDB 分区键和排序键的工作方式,因此可以有效地执行此操作:分区键也称为“哈希键”,因为它允许 DynamoDB 像在哈希表中一样有效地找到特定分区,而无需扫描整个表。然后,一个分区内,项目按排序键排序,因此要找到一个连续的排序键范围(KeyConditionExpression允许指定),DynamoDB 不需要扫描分区中的所有项目 - 它可以有效地找到请求的范围在 O(logN) 中。


推荐阅读