2016-03-18 9 views
1

私はMySQLに精通しており、Amazon DynamoDBを新しいプロジェクトに使用し始めています。このMySQL Queryの同等のDynamoDBソリューションとは何ですか?

CREATE TABLE foo (
    id CHAR(64) NOT NULL, 
    scheduledDelivery DATETIME NOT NULL, 
    -- ...other columns... 
    PRIMARY KEY(id), 
    INDEX schedIndex (scheduledDelivery) 
); 

注スピードアップするために(定期的に実行される)次のクエリを想定している二次インデックスschedIndex

SELECT * 
    FROM foo 
    WHERE scheduledDelivery <= NOW() 
    ORDER BY scheduledDelivery ASC 
    LIMIT 100; 

は、私はこのようなMySQLのテーブルを持っていると仮定しますは:配信されることになっている100の最も古いアイテムを取る。

DynamoDBでは、idの列をプライマリパーティションキーとして使用できます。

しかし、DynamoDBでフルテーブルスキャンを回避する方法はわかりません。セカンダリインデックスを追加するときは、必ず「パーティションキー」と指定する必要があります。しかし、(MySQLの言葉で)私は、これらの問題を参照してください。それはパーティション・キーそのものとして使用することはできませんので

  • scheduledDeliveryは、ユニークではありません私の知る限り
  • idとしてユニークなパーティションを追加キーと私はMySQLとDynamoDBのは、別のアプローチが必要であることを理解

インデックスがpratically役に立たないことになり、「ソート・キー」私に(id, scheduledDelivery)セカンダリインデックスのように聞こえる、とscheduledDeliveryを使用してこの場合、適切な解決策は何でしょうか?

答えて

1

この種のクエリでは、完全なテーブルスキャンを避けることはできません。

ただし、あなたは(Scanでは不可能な)結果を並べ替えることができるようになるQuery操作、としてそれを偽装することができるかもしれません。

まず、GSIを作成する必要があります。それをscheduled_delivery-indexと名をつけましょう。

インデックスのパーティションキーをfixed_valという属性に指定し、ソートキーをscheduled_deliveryと指定します。

fixed_valには任意の値が入りますが、常にその値でなければならず、クライアント側から知っている必要があります。この例のために、fixed_valは常に1になるとします。

GSIキーは一意である必要はないので、重複した2つの値がある場合は心配しないでください。scheduled_delivery

あなたはこのようにテーブルを照会します:固定パーティション・キーは、(効果的にパーティショニングを避ける)素晴らしいアイデアであること

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 
} 
+0

。私は疑問に思っています:DynamoDB/NoSQLを使用する場合、ここで説明されているような問題をまったく別の方法で解決しますか?おそらく別のテーブルデザインや追加のテーブルを使用していますか? –

関連する問題