#はじめに
個人的にDynamoDBのGSIを利用する機会かあったので簡潔にまとめてみました。
この記事ではGSI(グローバルセカンダリインデックス)の概要と基本的な作成、利用方法を解説いたします。
#DynamoDBでのクエリ
DynamoDBではパーティションキーとソートキーでしかクエリを行うことができません。
パーティションキーとソートキー以外でクエリを行いたいケースが発生した場合は主に下記の2つの対応策があります。
1.Scan
Scanを用いてテーブルをまるごと取得し、コードで特定のアイテムを取得するという方法です。
しかし、Scanについてはテーブルのデータ量が膨大になった場合の速度低下や1クエリで最大1MBまでしか
データを取得できないなど制約が多いためAWSドキュメントでもあまりおすすめしていないように思えます。
2.GSI
パーティションキーとソートキー以外でHash関数も持たせる事によって、パーティションキーやソートキーと同じようにQueryを実行することができます。
それでは今回のテーマであるGSIの作成方法と利用方法について解説していきます。
下記のよなユーザー情報のテーブルを想定します。
テーブル名 : Users
パーティションキー : userId
ソートキー : age
userId | age | name | |
---|---|---|---|
1 | 24 | Olivia | olivia@example.com |
2 | 32 | Emma | emma@example.com |
3 | 18 | Isabella | isabella@example.com |
#GSIの作成(AMC)
nameをGSIでパーティションキーとして設定する方法を手順を追って解説します。
インデックスの詳細設定
パーティションキーはすでに存在するものでも問題ありません。
データタイプは文字列、数値、バイナリの3つしか選択でいないことが注意点です。
インデクス作成
作成にはテーブルの使用量にもよりますが失敗したのかなって思うぐらい時間がかかるので気長に待ちましょう...(長くて1時間ぐらい)
「状態」の列が表示されなくなれば完了です。不思議なUIですね。。
#GSIのパーティションキーでQuery
まずはDynamoDBの「項目のエクスプローラー」から試してみます
「テーブルまたはインデクス」のプルダウンに先ほど作成したGSIのインデックス名が表示されています。
パーティションキーを指定して実行すると指定したアイテムが取得できました。
Python
通常のQueryに IndexName を用いてGSIを指定してあげればOKです。
name = 'Emma'
dynamodb = boto3.resource('dynamodb', region_name='ap-northeast-1')
table = dynamodb.Table('Users')
response = table.query(
IndexName = 'GSIName',
KeyConditionExpression = Key('name').eq(name)
)
pprint(response['Items'])
#注意事項
- GSIのデータタイプには「文字列」「数値」「バイナリ」の3つ。
- GSIは最大20個までしか作れない。
#終わりに
DynamoDBを利用するにあたってGSIはとても便利な機能です。
しかし、NoSQLの長所を活かしたいなどの理由以外で、設計の段階からGSIを利用する想定であればRDBMSの利用を再度検討してもいいのかもしれません。