セカンダリ・インデックスの使用
CQLを使用して、テーブルを定義した後にカラムのセカンダリ・インデックスを作成します。
テーブルを定義した後で、カラムに対してインデックスを作成します。セカンダリ・インデックスは、通常はクエリーを実行できないカラムを使用しているテーブルのクエリーを行う際に使用します。DataStax Enterpriseでは、コレクション・カラムのインデックス作成と静的カラムをサポートしています。
セカンダリ・インデックスはパフォーマンスに大きな影響を与える可能性があります。インデックス・テーブルはクラスターの各ノードに保存されるため、複数のノードにアクセスすると、セカンダリ・インデックスに関与するクエリーのパフォーマンスが急激に低下する可能性があります。一般的な経験則は、値が少なくカーディナリティが低いカラムのインデックスを作成することです。インデックスを作成する前に、インデックスを作成すべきでない場合について把握しておいてください。
重要: DSE Searchでは、データのインデックスを作成するために非常に堅牢なソリューションを提供できます。検索インデックスの管理とDSE Searchの構成方法について説明します。同一のテーブルにセカンダリ・インデックスと検索インデックスを追加しないでください。
手順
-
テーブル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';
race_year | race_name | rank | cyclist_name ----------+--------------------------------------------+------+----------------- 2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Benjamin PRADES 2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Adam PHELAN 2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 3 | Thomas LEBAS
-
試行する論理クエリーは、特定の年のランキングのリストです。テーブルには複合パーティション・キーがあるため、条件演算子で最初のカラムのみが使用されると、このクエリーは失敗します。
SELECT * FROM cycling.rank_by_year_and_name WHERE race_year = 2015;
InvalidRequest: code=2200 [Invalid query] message= "Partition key parts: race_name must be restricted as other parts are"
-
この例では、レースの年にインデックスが作成され、クエリーは成功します。インデックス名は任意で、キースペース内で固有でなければなりません。インデックス名を指定しない場合は、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;
race_year | race_name | rank | cyclist_name ----------+--------------------------------------------+------+----------------- 2015 | Giro d'Italia - Stage 11 - Forli > Imola | 1 | Ilnur ZAKARIN 2015 | Giro d'Italia - Stage 11 - Forli > Imola | 2 | Carlos BETANCUR 2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Benjamin PRADES 2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 2 | Adam PHELAN 2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 3 | Thomas LEBAS
-
クラスター化カラムもインデックスの作成に使用できます。rankのインデックスが作成され、クエリーで使用されます。
CREATE INDEX rrank ON cycling.rank_by_year_and_name (rank); SELECT * FROM cycling.rank_by_year_and_name WHERE rank = 1;
race_year | race_name | rank | cyclist_name ----------+--------------------------------------------+------+------------------- 2014 | 4th Tour of Beijing | 1 | Phillippe GILBERT 2015 | Giro d'Italia - Stage 11 - Forli > Imola | 1 | Ilnur ZAKARIN 2015 | Tour of Japan - Stage 4 - Minami > Shinshu | 1 | Benjamin PRADES