如何在 dynamodb table 上进行全局查询?

How to do global query on dynamodb table?

Dynamodb 是一个 name - value 数据库,查询需要分区键。我正在 Dyanmodb 中保存用户数据 table 但我想知道进行全局搜索的最佳方法是什么。

我的 table 包括这些字段:

id (PK)
firstName
lastName
email
phone
company ( GSI PK )

id 是 table 的分区键,company 是 gsi 的 PK。我一般用id查询个人用户,用company gsi查询公司下的用户,分页

现在我得到一个查询全球用户(没有任何公司)的需求。我不确定我应该如何支持它,因为它在查询中没有任何 PK。而且我不想使用扫描,因为它太贵了。

我能想到的一个解决方案是创建一个单独的字段,它对所有项目都有一个固定值。并在该领域创建一个 GIS。这样我就可以用固定值作为PK查询所有用户了。但是它会在我想避免的 table 中创建一个热分区。还有其他方法吗?

One solution I can think of is to create a separate field which has a fixed value for all items. And create a GIS on this field. In this way, I can use the fixed value as PK to query all users. But it will create a hot partition in the table I want to avoid. Is there any other way to do that?

你是对的,热分区的风险也是spot-on。对于解决方案,我们可以使用分桶。

首先,我了解到您的访问模式类似于:getUserByUsername(username: str)

这意味着您知道要查找的用户名。为了解决热分区问题,您可以根据用户名为 GSI 计算一个单独的分区键值(gsi2_pk),例如取前两个字符。

这意味着 table 布局可能是这样的:

gsi2_pk gsi2_sk
jo joey yi zhao
jo johnny b goode
ma maurice

通过这种方式,您可以将用户分布到更多的分区中。

这里的缺点是您的用户名可能不会均匀分布在存储桶中,您可能会无意中创建更多热分区。另一种方法是使用固定数量的桶 (n),然后将集合 gsi2_pk 设置为 hash(username) % n,这将更均匀地分配项目。