セカンダリ・インデックスの使用
CQLを使用して、テーブルを定義した後にカラムのセカンダリ・インデックスを作成します。
テーブルを定義した後で、カラムに対してインデックスを作成します。セカンダリ・インデックスは、通常はクエリーを実行できないカラムを使用しているテーブルのクエリーを行う際に使用します。
ヒント: DataStaxではDSE 5.0でコレクション・カラムのインデックス作成、DSE 5.1で静的カラムのインデックス作成がサポートされました。
セカンダリ・インデックスは、使用しにくく、パフォーマンスに大きな影響を与える場合があります。インデックス・テーブルはクラスターの各ノードに保存されるため、複数のノードにアクセスすると、セカンダリ・インデックスに関与するクエリーのパフォーマンスは急激に低下します。一般的な経験則は、値が少なくカーディナリティが低いカラムのインデックスを作成することです。インデックスを作成する前に、インデックスを作成すべき場合と作成すべきでない場合について把握しておいてください。
DataStax Enterprise 5.1以降では、新たなセカンダリ・インデックスとしてSSTable Attached Secondary Index(SASI)が実装され、セカンダリ・インデックスのパフォーマンスが大幅に向上したため、可能であればこちらを使用してください。
手順
-
テーブルrank_by_year_and_nameから、レースのサイクリストのランクを出力できます。
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_yearとrace_nameは両方とも、これらのカラムがパーティション・キーを構成するよう指定する必要があります。
SELECT * FROM cycling.rank_by_year_and_name WHERE race_year=2015 AND race_name='Tour of Japan - Stage 4 - Minami > Shinshu';
-
試行する論理クエリーは、特定の年のランキングのリストです。テーブルには複合パーティション・キーがあるため、条件演算子で最初のカラムのみが使用されると、このクエリーは失敗します。
SELECT * FROM cycling.rank_by_year_and_name WHERE race_year=2015;
-
レースの年にインデックスが作成され、クエリーは成功します。インデックス名は任意で、キースペース内で固有でなければなりません。名前を指定しない場合は、race_year_idxのような名前が割り当てられます。
CREATE INDEX ryear ON cycling.rank_by_year_and_name (race_year); SELECT * FROM cycling.rank_by_year_and_name WHERE race_year=2015;
-
クラスター化カラムもインデックスの作成に使用できます。rankのインデックスが作成され、クエリーで使用されます。
CREATE INDEX rrank ON cycling.rank_by_year_and_name (rank); SELECT * FROM cycling.rank_by_year_and_name WHERE rank = 1;