如何查询DynamoDB表中按排序键排序的100个第一项



我有一个名为Scores的简单DynamoDB表,它有三个属性:

| id                                   | score | username |
|--------------------------------------|-------|----------|
| ed6dbe2f-ffb3-44f3-a5f1-bb84502e5400 | 300   | bob      |
| b8f91dd9-09e6-466b-88f3-9e7b95dc9a3a | 100   | peter    |
| 55dd0bd1-2bc7-4bb7-a988-20e506c2c35c | 500   | bob      |

我的关键属性是hash key = idsort key = score

我想查询前100个最小的分数,用得分的玩家的用户名,订购asc。

在SQL中,in将是:

SELECT * FROM Scores ORDER BY score LIMIT 100;

我尝试了这些策略,但失败了:

  • 使用扫描=>它返回无序的项目
  • 使用查询=>我不想针对特定的主键值
  • 使用具有CCD_ 4和CCD_;我不能只使用排序键进行查询,我还必须指定哈希键

所以我糟糕的解决方案是执行扫描,然后在内存中排序和切片。。。叹息

我确信类似的问题已经在某个地方讨论和解决了,但我已经读了很多书,什么都找不到。你能给我一个提示吗?

创建一个具有奇异PK值和时间戳作为SK的GSI。然后,您可以对第一个1000执行Query,并传递100的limit

这是有效的,但最多只能有1000个写单元,因为这个奇异的PK值会变得很热。解决方案是碎片化。决定你需要多少个写作单元。10000?好的,所以用10代替一个PK值。每个项目都会随机分配一个碎片编号作为其GSI PK属性。

您的查询调用必须运行10个查询(客户端可以并行执行(,并合并结果客户端。适用于任何规模的写入流量。

这是中讨论的一种技术https://youtu.be/0iGR8GnIItQ(在33:44(。

最新更新