我正在探索在我工作的应用程序中使用DynamoDB,该应用程序目前只有一个数据库组件 - 在RDS上运行的MySQL数据库。
我们非常大量地使用AWS并为我们的数据库使用分片方案,但它只能让我们到目前为止没有人工干预。玩Aurora我实际上看到了与MySQL数据库相比性能的显着下降,因此我正在评估DynamoDB以确定它对我们有用,因为它可以有效地存储JSON数据,并且还可以轻松扩展(只需增加读取或写入)每秒在AWS控制台中,让亚马逊做繁重的工作。)
在我们的几个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作为RANGE或类似的东西。实际上,我需要遍历特定clientId / objectName组合的所有值,然后根据每行中的某些属性直接从缓存中获取其值,或者将其视为未命中并从S3中检索值(这是慢得多。)
答案 0 :(得分:1)
DynamoDB允许对基本上无限量的数据进行一致的低延迟查询。您建议使用连接值的模型似乎是一种很好的方法。
需要注意的一点是,散列键属性值限制为2048字节。如果您连接的值不是可预测的长度(您可以很好地填充它们)或超过此限制,则可能是一种更好的方法来散列项的值并根据项的散列进行搜索。以下是有关限制的相关文档:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html。 DynamoDB项目也限制为400KB的总数据。
为了正确,我还会为范围键使用一些唯一标识符,这将允许哈希值的冲突(即使它很少见)并且模式是可伸缩的,因为每个哈希有少量项目关键价值。