15
9

More than 3 years have passed since last update.

DynamoDB GSIの使い方を簡潔に解説

Last updated at Posted at 2021-05-15

はじめに

個人的にDynamoDBのGSIを利用する機会かあったので簡潔にまとめてみました。
この記事ではGSI(グローバルセカンダリインデックス)の概要と基本的な作成、利用方法を解説いたします。

DynamoDBでのクエリ

DynamoDBではパーティションキーとソートキーでしかクエリを行うことができません。
パーティションキーとソートキー以外でクエリを行いたいケースが発生した場合は主に下記の2つの対応策があります。

1.Scan
Scanを用いてテーブルをまるごと取得し、コードで特定のアイテムを取得するという方法です。
しかし、Scanについてはテーブルのデータ量が膨大になった場合の速度低下や1クエリで最大1MBまでしか
データを取得できないなど制約が多いためAWSドキュメントでもあまりおすすめしていないように思えます。

2.GSI
パーティションキーとソートキー以外でHash関数も持たせる事によって、パーティションキーやソートキーと同じようにQueryを実行することができます。

それでは今回のテーマであるGSIの作成方法と利用方法について解説していきます。

下記のよなユーザー情報のテーブルを想定します。
テーブル名 : Users
パーティションキー : userId
ソートキー : age

userId age name email
1 24 Olivia olivia@example.com
2 32 Emma emma@example.com
3 18 Isabella isabella@example.com

GSIの作成(AMC)

nameをGSIでパーティションキーとして設定する方法を手順を追って解説します。

対象のテーブル>インデックス>インデクスの作成
image.png

インデックスの詳細設定
パーティションキーはすでに存在するものでも問題ありません。
データタイプは文字列、数値、バイナリの3つしか選択でいないことが注意点です。

image.png

インデクス作成
作成にはテーブルの使用量にもよりますが失敗したのかなって思うぐらい時間がかかるので気長に待ちましょう...(長くて1時間ぐらい)
image.png

「状態」の列が表示されなくなれば完了です。不思議なUIですね。。
image.png

GSIのパーティションキーでQuery

まずはDynamoDBの「項目のエクスプローラー」から試してみます
「テーブルまたはインデクス」のプルダウンに先ほど作成したGSIのインデックス名が表示されています。
パーティションキーを指定して実行すると指定したアイテムが取得できました。
image.png

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'])

注意事項

  1. GSIのデータタイプには「文字列」「数値」「バイナリ」の3つ。
  2. GSIは最大20個までしか作れない。

終わりに

DynamoDBを利用するにあたってGSIはとても便利な機能です。
しかし、NoSQLの長所を活かしたいなどの理由以外で、設計の段階からGSIを利用する想定であればRDBMSの利用を再度検討してもいいのかもしれません。

15
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
9