您如何查询 DynamoDB?

Posted

技术标签:

【中文标题】您如何查询 DynamoDB?【英文标题】:How do you query DynamoDB? 【发布时间】:2012-02-26 05:18:02 【问题描述】:

我正在研究 Amazon 的 DynamoDB,因为它看起来消除了维护和扩展数据库服务器的所有麻烦。我目前正在使用 mysql,维护和扩展数据库是一件非常头疼的事情。

我已经浏览了文档,但我很难理解您将如何构建数据以便轻松检索。

我对 NoSQL 和非关系型数据库完全陌生。

从 Dynamo 文档看来,您只能在主哈希键和主范围键上查询具有有限数量的比较运算符的表。

或者您可以运行全表扫描并对其应用过滤器。问题是它一次只能扫描 1Mb,因此您可能需要重复扫描才能找到 X 个结果。

我意识到这些限制使它们能够提供可预测的性能,但似乎很难将您的数据取出。并且执行全表扫描似乎会非常低效,而且随着表的增长,效率只会随着时间的推移而降低。

例如,假设我有一个 Flickr 克隆。我的图片表可能类似于:

图像 ID(数字,主哈希键) 添加日期(数字,主范围键) 用户 ID(字符串) 标签(字符串集) 等

因此,使用查询我将能够列出过去 7 天的所有图像,并且很容易将其限制为 X 个结果。

但是,如果我想列出来自特定用户的所有图像,我需要进行全表扫描并按用户名过滤。标签也是如此。

因为您一次只能扫描 1Mb,您可能需要进行多次扫描才能找到 X 个图像。我也没有看到一种方法可以轻松地停在 X 个图像上。如果您尝试抓取 30 张图像,您的第一次扫描可能会找到 5 张,第二次可能会找到 40 张。

我有这个权利吗?它基本上是一种权衡吗?您可以获得真正快速、可预测的数据库性能,几乎无需维护。但权衡是您需要构建更多逻辑来处理结果?

或者我完全不在这儿了?

【问题讨论】:

【参考方案1】:

是的,您对性能和查询灵活性之间的权衡是正确的。

但是有一些技巧可以减轻痛苦 - 二级索引/非规范化可能是最重要的。

您将有另一个以用户 ID 为键的表,例如,列出他们的所有图像。当您添加图像时,您会更新此表并在以图像 ID 为键的表中添加一行。

您必须决定需要哪些查询,然后围绕它们设计数据模型。

【讨论】:

好吧,这很有道理。你会如何做类似标签的事情?主键是标签名称,然后范围键是图像 ID?我假设主键不能是字符串集。 这听起来很对,但我不熟悉 DynamoDB 的细节 - 而是使用 Cassandra。 第一次从zend查询DynamoDB时,需要3秒。然后执行其他查询只需不到一秒钟的时间。这可能是什么原因? 我不知道;我建议你创建一个新问题而不是在 cmets 中提问,并用 amazon-dynamodb 标记它... 我已经这样做了。但没有得到答案。所以我想你会知道的。看到这个***.com/questions/21525339/…【参考方案2】:

我认为您需要使用另一个表创建自己的二级索引

这个表“模式”可能是:

    User ID (String, Primary Key)
    Date Added (Number, Range Key)
    Image ID (Number)

--

这样您就可以按用户 ID 查询并按日期过滤

【讨论】:

【参考方案3】:

您可以使用复合哈希范围键作为主索引。

来自 DynamoDB 页面:

主键可以是单属性哈希键或复合键 哈希范围键。单个属性哈希主键可以是,对于 例如,“用户 ID”。这将允许您快速读取和写入数据 用于与给定用户 ID 关联的项目。

复合散列范围键被索引为散列键元素和 范围关键元素。这个多部分键维护了一个层次结构 第一个和第二个元素值。例如,一个复合 哈希范围键可以是“UserID”(哈希)和 “时间戳”(范围)。保持散列键元素不变,你可以 搜索范围键元素以检索项目。 这会 例如,允许您使用查询 API 检索所有项目 跨多个时间戳的单个 UserID。

【讨论】:

以上是关于您如何查询 DynamoDB?的主要内容,如果未能解决你的问题,请参考以下文章

DynamoDB - 如何计算查询的读取吞吐量

DynamoDb:扫描查询不会返回所有数据

如何使用 AWS Lambda 按名称查询 dynamoDB 表

AWS IoT DynamoDB创建规则

Dynamodb 我可以用两个 GSI 查询吗?

使用 EMR 查询 DynamoDB 数据