169

これら 2 つの副次索引と、それらの違いに興味があります。これがどのように見えるか想像するのは難しいです。そして、これは私だけでなく多くの人を助けると思います。

4

7 に答える 7

134

ローカル セカンダリ インデックスは、依然として元のハッシュ キーに依存しています。hash+range でテーブルを提供するときは、LSI を hash+range1、hash+range2..hash+range6 と考えてください。さらに 5 つの範囲属性を取得してクエリを実行します。また、プロビジョニングされたスループットは 1 つだけです。

Global Secondary Indexes は、インデックスごとに異なるハッシュ/範囲キーという新しいパラダイムを定義します。
これにより、テーブルごとに 1 つのハッシュ キーという本来の使用法が破られます。これは、GSI を定義するときに、インデックスごとにプロビジョニングされたスループットを追加して支払う必要がある理由でもあります。

違いの詳細については、GSI の発表を参照してください。

于 2014-01-27T14:37:21.080 に答える
34

インデックスによる可能な検索は次のとおりです。

  • ハッシュ別
  • ハッシュ + 範囲別
  • ハッシュ + ローカル インデックス別
  • グローバルインデックス別
  • グローバル インデックス + レンジ インデックス別

テーブルのハッシュおよび範囲インデックス: これらは、Amazon AWS SDK の以前のバージョンの通常のインデックスです。

グローバル インデックスとローカル インデックス: これらは、テーブルの既存のハッシュ インデックスと範囲インデックスに加えて、テーブルに作成される「追加の」インデックスです。 グローバル インデックスはハッシュに似ています。範囲インデックスは、テーブルのハッシュで使用される範囲インデックスと同様に動作します。コード内のエンティティ モデルでは、ゲッターに次のように注釈を付ける必要があります。

  • グローバル索引の場合:

    @DynamoDBIndexHashKey(globalSecondaryIndexName = INDEX_GLOBAL_RANGE_US_TS)
    @DynamoDBAttribute(attributeName = PROPERTY_USER)
    public String getUser() {
        return user;
    }
    
  • グローバル索引に関連付けられた範囲索引の場合:

    @DynamoDBIndexRangeKey(globalSecondaryIndexName = INDEX_GLOBAL_RANGE_US_TS)
    @DynamoDBAttribute(attributeName = PROPERTY_TIMESTAMP)
    public String getTimestamp() {
        return timestamp;
    }
    

また、グローバル インデックスでテーブルを読み取る場合は、最終的な読み取り (一貫性のある読み取りではない) である必要があります。

queryExpression.setConsistentRead(false);
于 2014-03-27T10:41:09.607 に答える
28

それを置く1つの方法はこれです:

LSI - 複数の異なる属性を使用してクエリを「フィルタリング」または制限しながら、単一のハッシュキーでクエリを実行できます。

GSI - テーブル内の複数のハッシュ キーに対してクエリを実行できますが、その結果、スループットに余分なコストがかかります。

テーブルの種類とその機能の詳細な内訳を以下に示します。

ハッシュのみ

おそらくすでにご存知でしょう。すでに存在するハッシュキーに書き込むと既存のデータが上書きされるため、ハッシュキー自体は一意である必要があります。

ハッシュ+範囲

Hash-Key + Range-Key を使用すると、範囲キーが異なる限り、同じハッシュ キーを複数持つことができます。この場合、既に存在するハッシュ キーに書き込むが、そのハッシュ キーでまだ使用されていない範囲キーを使用すると、新しいアイテムが作成されますが、同じハッシュ + 範囲の組み合わせを持つアイテムの場合は、既に存在する場合、一致するアイテムを上書きします。

これを考える別の方法は、形式を持つファイルのようなものです。形式 (範囲) が異なる限り、同じフォルダー (テーブル) 内に別のファイルと同じ名前 (ハッシュ) のファイルを含めることができます。同様に、名前が異なる限り、同じ形式の複数のファイルを持つことができます。

LSI

LSI は基本的に Hash-Key + Range-Key と同じであり、LSI にも値を提供する必要があることを除いて、アイテムを作成するときに LSI と同じ規則に従います。空/nullのままにすることはできません。

LSI が "Range-Key 2" であると言うのは完全に正しいとは言えません (ファイルとフォーマットの類推を使用して)file.format.lsifile.format.lsi2. ただし、file.format.lsiandfile.format2.lsiまたはfile.format.lsiand を使用できfile2.format.lsiます。

基本的に、LSI は単なる「フィルター キー」であり、実際の範囲キーではありません。LSI 値は一意である必要はまったくありませんが、基本ハッシュ値と範囲値の組み合わせは一意である必要があります。LSI をファイル内のデータと考えた方が分かりやすいかもしれません。に関係なく、「PROJECT101」という名前のすべてのファイルを検索し、fileFormat内部のデータを読み取って、クエリに含める必要があるものと除外するものを判断するコードを作成できます。これが基本的に LSI の仕組みです (ファイルを開いてその内容を読み取るという余分なオーバーヘッドはありません)。

GSI

GSI の場合、基本的には GSI ごとに別のテーブルを作成しますが、それらの間でデータをミラーリングする複数の個別のテーブルを維持する手間はありません。これが、より多くのスループットを必要とする理由です。

したがって、GSI の場合はfileName、ベース ハッシュ キーfileFormatとして、およびベース レンジ キーとして指定できます。fileName2次に、Hash-Keyと Range-Key を持つ GSI を指定できますfileFormat2。のみをクエリできる LSI とは異なり、必要に応じてfileNameまたはのいずれかでクエリを実行できます。fileName2fileName

主な利点は、2 つではなく 1 つのテーブルを維持するだけでよく、プライマリ ハッシュ/範囲または GSI ハッシュ/範囲のいずれかに書き込むと、他のものも自動的に更新されることです。そのため、複数テーブルのセットアップでできるように、他のテーブルを更新することを「忘れる」ことはできません。また、マルチテーブル設定の場合のように、一方を更新した後、もう一方を更新する前に接続が失われる可能性はありません。

さらに、GSI は基本ハッシュ/範囲の組み合わせを「オーバーラップ」できます。したがって、ベース ハッシュ/範囲として andを使用し、GSI としてfileNameandを使用してテーブルを作成したい場合は、それが可能です。fileFormatfilePriorityfileName

最後に、GSI ハッシュと範囲の組み合わせは一意である必要はありませんが、基本のハッシュと範囲の組み合わせは一意である必要があります。これは、デュアル/マルチ テーブル セットアップでは不可能なことですが、GSI では可能です。その結果、更新時にベースと GSI Hash+Range の両方の値を提供する必要があります。これらの値はいずれも空/null にすることはできません。

于 2016-07-07T18:53:42.680 に答える
19

説明する別の方法: LSI は、同じハッシュ キーを持つアイテムに対して追加のクエリを実行するのに役立ちます。GSI は、「テーブル全体」のアイテムに対して同様のクエリを実行するのに役立ちます。とても便利です。

ユーザー プロファイル テーブルがある場合: unique-id、name、email。ここで、名前、電子メールでテーブルをクエリ可能にする必要がある場合、唯一の方法はそれらを GSI にすることです (LSI は役に立ちません)。

于 2014-02-11T13:40:31.443 に答える