セカンダリ・インデックスの使用

CQLを使用して、テーブルを定義した後にカラムのセカンダリ・インデックスを作成します。

CQLを使用すると、テーブルを定義した後にカラムのインデックスを作成することができます。Cassandra 2.1以降では、コレクション・カラムのインデックスを作成することができます。セカンダリ・インデックスは、パーティション・キーやパーティション・キーおよび最初のクラスター化カラムなど、通常はクエリーできないカラムを使用してテーブルをクエリーするときに使用します。

セカンダリ・インデックスは、使用しにくく、パフォーマンスに大きな影響を与える場合があります。インデックス・テーブルはクラスターの各ノードに保存されるため、複数のノードにアクセスすると、セカンダリ・インデックスに関与するクエリーのパフォーマンスは急激に低下します。一般的な経験則は、少数の値の低いカーディナリティでカラムのインデックスを作成することです。インデックスを作成する前に、インデックスが作成される場合と作成されない場合について把握しておいてください。

手順

  • テーブルrank_by_year_and_nameは、レースのサイクリストのランクとなります。
    cqlsh> CREATE TABLE cycling.rank_by_year_and_name ( race_year int, race_name text, cyclist_name text, rank int, PRIMARY KEY ((race_year, race_name), rank) );
  • race_yearrace_nameは両方とも、これらのカラムがパーティション・キーを構成するよう指定する必要があります。
    cqlsh> SELECT * FROM cycling.rank_by_year_and_name WHERE race_year=2015 AND race_name='Tour of Japan - Stage 4 - Minami > Shinshu';


  • 試行する論理クエリーは、特定の年のランキングのリストです。テーブルには複合パーティション・キーがあるため、条件演算子で最初のカラムのみが使用されると、このクエリーは失敗します。
    cqlsh> SELECT * FROM cycling.rank_by_year_and_name WHERE race_year=2015;


  • レースの年にインデックスが作成され、クエリーは成功します。インデックス名は任意で、キースペース内で固有でなければなりません。名前を入力しない場合は、race_year_idxのような名前が割り当てられます。
    cqlsh> CREATE INDEX ryear ON cycling.rank_by_year_and_name (race_year); SELECT * FROM cycling.rank_by_year_and_name WHERE race_year=2015;


  • クラスター化カラムもインデックスの作成に使用できます。