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

随机查询DynamoDB表的较好方法?

王修为
2023-03-14

我已经包括了一些链接与我们的方法,以其他答案,似乎是最优化的在网络上现在。

我们的记录需要分类(例如“恐怖”、“惊悚”、“电视”),并且可以在特定类别和所有/某些类别中随机访问。我们一般一次需要访问20-100个项目左右。我们也有少量的类别(不到100个)。

我们写入数据库来上传/移除内容,尽管这是成批完成的,不需要是实时的。

我们用两种不同的数据结构尝试了两种不同的方法。

AWS DynamoDB-随机选择一个记录/项目?

帮助选择查询中的第n条记录。

简而言之,使用类别作为散列键,使用UUID作为排序键。生成随机UUID,使用大于或小于查询Dynamo,并限制为1。这甚至是AWS的一位员工在第二个环节中建议的。(我们还尝试增加所需项的数量限制,但这增加了查询第一次失败的可能性)。

这种方法的问题:

  • 如果第一个查询大于/小于任何UUID
  • 查询任何特定类别将导致缩放限制(分区数较少)

我们还考虑过为每个类别添加一个后缀,以人为地增加我们拥有的分区数量,正如下面的链接所指出的那样。

AWS数据库博客选择正确的DynamoDB分区密钥

Amazon Web Services:我们如何从DynamoDB的表中获取随机项?

执行类似的操作,我们将类别与一个顺序数字连接起来,并将其用作散列键。例如Horror-000001。

通过知道每个类别中的记录数,我们能够在整个数据集上执行随机查询,同时避免热分区/键。

这种方法的问题

  • 我们需要一个辅助数据结构来管理每个类别的顺序计数
  • 写入(特别是删除)要复杂得多,尽管这不需要实时发生。

这两种方法都解决了我们对类别/类别进行随机查询的主要用例,但它们提供的缺点确实阻碍了我们使用它们。我们更倾向于使用后缀来解决热点分区问题的方法#1,尽管对于失败的查询,我们需要额外的重试逻辑。

有没有更好的办法来解决这个问题?特别是寻找能够很好地缩放(无扫描)的解决方案,而不需要实施额外的资源。#1符合法案,但需要管理后缀和失败的尝试真的阻止我们使用它,特别是当它是在一个lambda(使用的时间计费)内调用。

谢谢!

共有2个答案

宋嘉懿
2023-03-14

经过更多的研究和测试,我的团队决定为这些表转向RDS上托管的MySQL。我们了解到这是为数不多的DynamoDB不适合的用例之一,并且需要重写您的用例以适合DB(坏)。

我们觉得在DynamoDB上集成随机抽样所需的额外复杂性是不值得的,而且我们无法提出任何类似的解决方案。但是,由于价格和响应时间的原因,我们仍然坚持使用DynamoDB来处理我们的表,因为这些表不需要随机访问。

对于那些想知道我们为什么选择MySQL的人来说,这很大程度上是因为Nodejs库可用、大量的在线资源(DynamoDB绝对缺乏这些资源)、通过RDS与Lambdas的轻松集成,以及迁移到Amazons Aurora数据库的选项。

我们还研究了PostgreSQL,但我们对客户端库或管理工具并不满意,我们相信MySQL将满足我们对这些表的需求。

如果任何人有任何其他的东西,他们想要补充或一个具体的问题,请留下评论或给我一个消息!

屈浩波
2023-03-14

这段话太长了,不适合发表评论,我想它现在已经是一个完整的答案了。

方法2

我发现从dynamodb将单个项目发送到同一区域的主机的典型时间为<10ms。只要您最多能处理1-2个额外调用,您就可以很容易地实现方法2。

如果您使用一个仅GSI的键,其中类别是您的哈希键,表的主键是您的范围键,您可以快速找到一个类别中编号最大的单个项。

添加新项目时,从GSI中找到该类别的最大数字,然后将新项目写入序号为n+1的表中。

删除时,从GSI中找到该类别具有最大序号的项目,覆盖要删除的项目,然后从其序号最高的位置删除现在重复的项目。

若要随机获取一个项目,请查询GSI以找到类别中编号最高的项目,然后随机选取一个数字,因为您现在知道了有效范围。

方法1

我不太清楚你说的“不需要额外的资源来实施”到底是什么意思。如果您可以使用托管资源(没有开发工作要实现),还可以通过在dynamodb表前面放置DAX集群来使方法1工作。然后您就可以尽情地查询,而不必真正担心热分区。(尽管缓存层意味着新的/已删除的项目不会立即反映出来。)

 类似资料:
  • 我刚开始在DynamoDB上建一个社交网站。 我将有相当数量的数据与一个用户相关,我计划将这些全部放入一个表中--例如: 用户ID 出生日期 头发 照片URL 详细信息 可能有几百个属性。 问题: 将这么多数据放入一个表中有什么问题吗? 我如何查询该数据(我是否可以执行类似这样的查询:“所有在这个年龄,这个颜色头发,这个位置,并且这次登录的成员)-假设所有这些数据都包含在表中? 如果一个表的内容很

  • 问题内容: 我正在使用Android-Query进行HTTP调用,并且不断收到随机的SSLException,如下所示: 似乎没有韵律或原因。发生这种情况的时间大概是我打任何电话的时间的1/6。 这是我使用Android-Query()的方式: //申请创建: //使用方法//注意:uri = // 07-13 17:26:08.040:W / AQuery(7746):获取:https ://s

  • 问题内容: 有没有什么方法可以模拟Collections.shuffle的行为,而比较器不容易受到排序算法实现的影响,从而确保结果安全? 我的意思是不违反可比合同等。 问题答案: 不打破合同就不可能实现真正的“改组比较器”。合同的一个基本方面是,结果是可 重现的, 因此必须确定特定实例的顺序。 当然,您可以使用混洗操作预先初始化该固定顺序,并创建一个比较器来精确地建立此顺序。例如 虽然没有意义。显

  • 是否有任何方法可以模拟Collections.shuffle的行为,而比较器不容易受到排序算法实现的影响,以确保结果安全? 我的意思是不违反类似的合同等..

  • 如何修复以下错误以及为什么会出现“操作数类型:M”?我已经阅读了aws文档并搜索了堆栈溢出,但几个小时后仍然无法解决此问题。我想以iso格式查询一个处于活动状态且日期介于开始日期和结束日期之间的项目。我将错误“操作数类型:M”解释为在操作数:datesell、:start和:end中使用映射类型。但是,所有操作数都只是字符串。 SQL命令类似于:SELECT datesell,profit FRO

  • 问题内容: 我正在使用这个简单的查询来对ms-access数据库使用随机排序: 当我使用Microsoft Access 2010测试它时,它工作正常 但是,当我使用经典asp调用此查询时,随机排序不起作用。 这是我的代码: 问题答案: 您只需要对随机生成器“加盐”即可: