Amazon dynamodb 这个MySQL查询的等效DynamoDB解决方案是什么?
我熟悉MySQL,并开始将AmazonDynamodB用于一个新项目 假设我有一个MySQL表,如下所示:Amazon dynamodb 这个MySQL查询的等效DynamoDB解决方案是什么?,amazon-dynamodb,Amazon Dynamodb,我熟悉MySQL,并开始将AmazonDynamodB用于一个新项目 假设我有一个MySQL表,如下所示: CREATE TABLE foo ( id CHAR(64) NOT NULL, scheduledDelivery DATETIME NOT NULL, -- ...other columns... PRIMARY KEY(id), INDEX schedIndex (scheduledDelivery) ); var now = Date.now(); //..
CREATE TABLE foo (
id CHAR(64) NOT NULL,
scheduledDelivery DATETIME NOT NULL,
-- ...other columns...
PRIMARY KEY(id),
INDEX schedIndex (scheduledDelivery)
);
var now = Date.now();
//...
{
TableName: "foo",
IndexName: "scheduled_delivery-index",
ExpressionAttributeNames: {
"#f": "fixed_value",
"#d": "scheduled_delivery"
},
ExpressionAttributeValues: {
":f": 1,
":d": now
},
KeyConditionExpression: "#f = :f and #d <= :d",
ScanIndexForward: true
}
注意二级索引schedIndex,它应该加速定期执行的以下查询:
SELECT *
FROM foo
WHERE scheduledDelivery <= NOW()
ORDER BY scheduledDelivery ASC
LIMIT 100;
也就是说:取100件最旧的物品,这些物品将被交付
使用DynamoDB,我可以使用id列作为主分区键
然而,我不明白如何在DynamoDB中避免全表扫描。添加辅助索引时,我必须始终指定分区键。但是,用MySQL的话来说,我看到了这些问题:
scheduledDelivery列不是唯一的,因此它本身不能用作分区键AFAIK
添加id作为唯一的分区键,并使用scheduledDelivery作为排序键,这听起来像是一个id,scheduledDelivery二级索引,这使得该索引实际上毫无用处
我知道MySQL和DynamoDB需要不同的方法,那么在这种情况下,什么是合适的解决方案呢?使用这种查询不可能避免完整的表扫描 但是,您可以将其伪装为查询操作,这将允许您对扫描无法得到的结果进行排序 您必须首先创建一个。让我们把它命名为scheduled\u delivery-index 我们将把索引的分区键指定为名为fixed_val的属性,并将排序键指定为scheduled_delivery fixed_val将包含您想要的任何值,但它必须始终是该值,并且您必须从客户端了解它。在本例中,假设fixed_val始终为1 GSI密钥不必是唯一的,所以如果有两个重复的计划交付值,也不用担心 您可以这样查询表:
CREATE TABLE foo (
id CHAR(64) NOT NULL,
scheduledDelivery DATETIME NOT NULL,
-- ...other columns...
PRIMARY KEY(id),
INDEX schedIndex (scheduledDelivery)
);
var now = Date.now();
//...
{
TableName: "foo",
IndexName: "scheduled_delivery-index",
ExpressionAttributeNames: {
"#f": "fixed_value",
"#d": "scheduled_delivery"
},
ExpressionAttributeValues: {
":f": 1,
":d": now
},
KeyConditionExpression: "#f = :f and #d <= :d",
ScanIndexForward: true
}
固定分区键是一个有效避免分区的好主意。我想知道:当使用DynamoDB/NoSQL时,人们是否以完全不同的方式解决了这里描述的问题?可能使用不同的表格设计,甚至是其他表格?