database - dynamodb查询中的属性和键有什么区别
问题描述
假设我将“名称”作为主键,将“时间戳”作为排序键。我意识到我可以同时使用 Attr("timestamp") 和 Key("timestamp") 进行查询。
我还可以使用 filterexpression(Attr("account").eq("john")) 以及使用 keyconditionexpression=Key("account").eq("john") 的查询进行表扫描,这给了我相同的结果.
所以我有两个问题。一般来说,如果我有相同的条件,使用扫描或查询会有所不同吗?在进行查询时,具有与任何其他数字属性不同的排序键有什么意义?
解决方案
虽然 a Scan
with aFilterExpression
和 a Query
withKeyConditionExpression
可能返回相同的结果,但在执行方式、性能和成本方面存在很大差异。在您的情况下,强烈建议使用 a Query
,而不是 a Scan
。让我解释:
AScan
总是扫描整个表。它可能会根据 过滤掉一些东西FilterExpression
,但是 DynamoDB 仍然需要读取表中的所有项目,并且您将为这些读取付费。以非常有选择性的方式进行扫描FilterExpression
(仅返回表的一小部分)几乎总是一个坏主意。相对于您尝试读取的数据量,它会非常慢并且花费很多。
另一方面,Query
可以有效地直接跳转到您要求的分区(KeyConditionExpression
只能指定单个分区键),并且在该分区内,只读取您在 中指定的排序键范围KeyConditionExpression
。这样做所花费的时间以及您的成本只会与您实际阅读的项目数量成正比——即使这些只是整个表格的一小部分。
Query
由于 DynamoDB 分区键和排序键的工作方式,因此可以有效地执行此操作:分区键也称为“哈希键”,因为它允许 DynamoDB 像在哈希表中一样有效地找到特定分区,而无需扫描整个表。然后,在一个分区内,项目按排序键排序,因此要找到一个连续的排序键范围(KeyConditionExpression
允许指定),DynamoDB 不需要扫描分区中的所有项目 - 它可以有效地找到请求的范围在 O(logN) 中。
推荐阅读
- node.js - Express.js - TypeError:无法读取未定义的属性“渲染”
- python - 将两个列表的元素保存在文件的列中
- django - 在请求中将模型对象 ID 作为参数传递有多安全?
- javascript - Vue:v-for 将不匹配的项目存储到不同的容器
- ssh - 当我在 `ddev auth ssh` 之后尝试在 DDEV Web 容器中使用 ssh 时,ssh 密钥似乎不起作用,“身份验证失败太多”
- regex - 是否有替代正则表达式语法来避免错误“不支持环视,包括前瞻和后视”?
- java - 如何在 Spring 应用程序中实现安全性?
- php - Laravel 统计用户的支持票
- node.js - 如何在本地为无服务器离线设置 ssm 参数
- opencv - 我安装了opencv-python得到导入错误