AWS re:Invent2013参加レポート #11 Announcing Global Secondary Indexes for DynamoDB

2013.11.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

本日re:Inventの基調講演で,DynamoDBにGlobalSecondaryIndexが来るよと、お話があったのですが、 2013/11/14 6:00 (現地時間)の段階でDocumentも更新されていません。
2013年中には使えるようになるそうです。
re:InventではAWSもブースを出していて、そこで直接話しを聞けます。
Announceはされたものの、なんの情報も無いので、直接ブースで話を聞いてきたものを紹介します。

LocalSecondaryIndexのおさらい。

すでにある、LocalSecondaryIndexとはなにかと言うのはこちらにわかりやすく書いてあると思います。
LocalSecondaryIndexのLocalというのは,"一つのパーティションの中で"という意味でした。
dynamoDBのFAQ(日本語)を見てみると

Q: 項目コレクションとは何ですか? また、LSI とどのように関係していますか? Amazon DynamoDB では、項目コレクションとは、テーブルおよびテーブルのローカルセカンダリインデックス全体で同じハッシュキーを持つ任意の項目グループです。
従来のパーティション化(またはシャーディング)されたリレーショナルデータベースシステムでは、シャードまたはパーティションと呼ばれており、1 つのハッシュキーに含まれるすべてのデータベース項目または行を指していました。
項目コレクションは、ローカルセカンダリインデックスを含むすべてのテーブルに対して自動的に作成され、維持されます。DynamoDB では、各項目コレクションが単一のディスクパーティションに格納されます。

とあるように、ハッシュキーを元にパーティションを作っていきます。
ということはどうゆうことかと言うと、LocalSecondaryIndexでは、ハッシュキーは必ず指定します。
DynamoDB Table
これは、誰が何を買ったのかというのを保存しているテーブルです。 LocalSecondaryIndexを使わない場合は、user_idが12345の人の買ったもの全部を取ってくる、もしくはorder_idを[範囲]指定することで、取得するという事ができました。

ex)
  query : user_id=12345, order_id > 12000

ここにLocalSecondaryIndexの機能を使うとuser_idが12345の人がcoffeeを買っているデータを取り出すという事が出来るようになります。

ex) 
  query : user_id=12345, product = "coffee"

RangeKeyの代わりにSecondaryIndexを使う事が出来ました。
代わりに使う事が出来るのですが、SecondaryIndexでは比較に“ = ”しか使えないという事に注意が必要です。

GlobalSecondaryIndexとはこれだ!

GlobalSecondaryIndex 資料が何もないので、AWSのブースに行って聞いてきました。
使い方としては、LocalSecondaryIndexとほとんど変わりません。
一つ大きく変わったところとして、GlobalSecondaryIndexを使う場合はQueryの時にハッシュキーを指定する必要がなくなりました。
もう一度、先ほどのテーブルで説明します。
DynamoDB Table このテーブルから、GlobalSecondaryIndexを利用することで、

ex.) 
  query : product=coffee
  query : product=coffee , order_id > 12000

のような使い方が出来るようになります。
HashKeyが必須ではなくなっているので、LoclaSecondaryIndexに比べてだいぶ設計が楽になりそうです。
今までRDBMSで設計していたモノがDynamoDBに置き換えられるかもしません。

制限

LocalSecondaryIndexの時もそうでしたが、もちろん制限もあるようです。 SecondaryIndexは" = "でしか比較出来ない点もLocalSecondaryIndexと同じだそうです。
Queryに含められるIndexはひとつというのも同じようです。
パーティション毎にデータ容量が10GByteまでという容量制限がついてしましましたが、GlobalSecondaryIndexも同じ制限がつくようです。
これはQueryにHashKeyが必要なくなったので、設計を見直せば、簡単に回避出来そうな気がします。

さいごに

 Amazon DynamoDBでGlobalSecondaryIndexが使えるようになったら、今までよりもグッと使い勝手が良くなりますね。
 年内にリリースするということなので、首を長くして待ちましょう。