Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon dynamodb 这个MySQL查询的等效DynamoDB解决方案是什么?_Amazon Dynamodb - Fatal编程技术网

Amazon dynamodb 这个MySQL查询的等效DynamoDB解决方案是什么?

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(); //..

我熟悉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();

//...

{
   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时,人们是否以完全不同的方式解决了这里描述的问题?可能使用不同的表格设计,甚至是其他表格?