【发布时间】:2015-08-31 18:51:47
【问题描述】:
我正在探索在我工作的应用程序中使用 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 作为 RANGE 或类似的东西。实际上,我需要翻阅特定 clientId/objectName 组合的所有值,然后根据每行中的某些属性直接从缓存中获取其值,或者将其视为未命中并从 S3 检索值(即慢得多)。
【问题讨论】:
标签: amazon-web-services amazon-dynamodb