如何在 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
,这将更均匀地分配项目。
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
,这将更均匀地分配项目。