gpt4 book ai didi

amazon-web-services - DynamoDB 中具有超过 2 列的复合键?

转载 作者:行者123 更新时间:2023-12-04 18:02:40 26 4
gpt4 key购买 nike

我正在探索 DynamoDB 在我工作的应用程序中的使用,该应用程序目前只有一个数据库组件——一个在 RDS 上运行的 MySQL 数据库。

我们大量使用 AWS 并为我们的数据库使用分片方案,但它只能在没有人工干预的情况下让我们走这么远。在使用 Aurora 时,我实际上发现与我们的 MySQL 数据库相比性能显着下降,所以我正在评估 DynamoDB 以查看它是否适合我们,因为它可以有效地存储 JSON 数据,并且还可以轻松扩展(只需增加读取或写入)每秒在 AWS 控制台中运行,让 Amazon 完成繁重的工作)。

在我们的几个 MySQL 表中,我们有一个主键,它是一个自动增量列,但我们也有几个索引,以其他方式支持查询性能。其他索引至关重要,因为我们的一些表中有超过 10 亿行。本质上,我们在客户端、object_name 等之间划分事物。所以我可能会在 MySQL 中做这样的事情:

Create Table: CREATE TABLE `record` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`client_id` int(10) unsigned NOT NULL,
`data_id_start` bigint(20) unsigned NOT NULL,
`data_id_end` bigint(20) unsigned NOT NULL DEFAULT '8888888888888888',
`object_name` varchar(255) NOT NULL,
`uuid` varchar(255) NOT NULL,
`deleted` tinyint(1) unsigned NOT NULL DEFAULT '0',
...
PRIMARY KEY (`id`),
...
KEY `client_id_object_name_data_id_data_id_end_deleted` (`client_id`,`object_name`,`data_id_start`,`data_id_end`,`deleted`),
KEY `client_id_object_name_data_id_end_uuid_id` (`client_id`,`object_name`,`data_id_end`,`uuid_id`),
...
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

我正在评估将其中一些数据复制到 DynamoDB 中以用作缓存,因此在某些情况下我们不必去 S3 检索那里存储的数据。相反,我只是将 JSON 数据直接存储在缓存中。在 DynamoDB 中,看起来我可以在键中使用 HASH 或 HASH 和 RANGE 属性。因此,例如,我可以使用 MySQL 表中的自动增量列作为 HASH,但是我看到的所有 RANGE 键、全局/本地二级索引等示例仅指定 ONE 其他属性作为范围。当在“where”子句中指定了 3 个或更多值时,我想创建一个索引以进行高效查找。

例如,我想使用如下表达式查询此表:

var params = {
TableName: "Cache",
KeyConditionExpression: "clientId = :clientId and objectName = :objectName and uuid = :uuid",
ExpressionAttributeValues: {
":clientId": 17,
":objectName": "Some name",
":uuid": "ABC123-KDJFK3244-CCB"
}
};

请注意,我在 KeyConditionExpression 中的“where 子句”使用了 3 个值。我们可能在那里有 4 或 5 个值。那么在 DynamoDB 中有没有什么方法可以创建其中包含 2 个以上属性(列)的复合键?

如果没有,我想我可以将 3 列连接成一个字符串,并在每次插入时将其用作我的主键。或者至少连接 clientId 和 objectName,然后使用 uuid 作为范围或类似的东西。实际上,我需要对特定 clientId/objectName 组合的所有值进行分页,然后根据每一行中的某些属性直接从缓存中获取其值,或者将其视为未命中并从 S3 中检索值(这是相当慢)。

最佳答案

为此,DynamoDB 允许对基本上无限量的数据进行一致的低延迟查询。您建议的连接值的模型似乎是一种不错的方法。

需要注意的是哈希键属性值限制为 2048 字节。如果您连接的值不是可预测的长度(您不能很好地填充它们)或超过此限制,则散列项目的值并根据项目的散列进行搜索可能是更好的方法。这是有关限制的相关文档:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html . DynamoDB 项目的总数据也限制为 400KB。

为了正确起见,我还会为范围键使用一些唯一标识符,这将允许散列值发生冲突(即使这种情况很少见)并且架构是可扩展的,因为每个散列键值有少量项目。

关于amazon-web-services - DynamoDB 中具有超过 2 列的复合键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32317994/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com