CREATE INDEX

テーブルの1つのカラムを対象とした新しいインデックスを定義します。

テーブルの1つのカラムを対象とした新しいインデックスを定義します。そのカラムに既にデータが含まれている場合は、この文の実行時にカラムのインデックスが作成されます。インデックスが作成された後は、カラムのデータが変更されると自動的に更新されます。DataStax Enterpriseは、PRIMARY KEYのパーティション・カラムとクラスター・カラム、コレクション、静的カラムを含む、大半のカラムを対象としたインデックスの作成をサポートしています。インデックスの作成はパフォーマンスに影響を及ぼす可能性があります。インデックスを作成する前に、インデックスを作成すべき場合と作成すべきでない場合について把握しておいてください。

制約事項: カウンター・カラムのインデックスの作成はサポートされていません。マップの場合は、キー、値、およびエントリーのインデックスを作成してください。

構文

CREATE INDEX [ IF NOT EXISTS ] index_name
  ON [keyspace_name.]table_name 
  ([ ( KEYS | FULL ) ] column_name) 
  (ENTRIES column_name) ;
1. 凡例
構文規則 説明
大文字 リテラル・キーワード。
小文字 リテラル以外。
イタリック体 変数値。ユーザー定義値と置き換えます。
[] 任意。角かっこ( [] )で任意指定のコマンド引数を囲みます。角かっこは入力しないでください。
( ) グループ。丸かっこ(( ))は、選択肢を含むグループを示します。丸かっこは入力しないでください。
| または。縦棒( | )で代替要素を区切ります。要素のいずれかを入力してください。縦棒は入力しないでください。
... 繰り返し可能。省略記号(...)は、構文要素を必要な回数だけ繰り返すことができることを示します。
'Literal string' 単一引用符( ' )でCQL文内のリテラル文字を囲みます。大文字を維持するには、単一引用符を使用します。
{ key : value } マップ・コレクション。中かっこ( { } )でマップ・コレクションまたはキーと値のペアを囲みます。コロンでキーと値を区切ります。
<datatype1,datatype2> セット、リスト、マップ、またはタプル。山かっこ(< >)で、セット、リスト、マップまたはタプル内のデータ型を囲みます。データ型はコンマで区切ります。
cql_statement; CQL文の終了。セミコロン( ; )ですべてのCQL文を終了します。
[--] コマンドライン・オプションとコマンド引数は、2つのハイフン(--)。この構文は、引数がコマンドライン・オプションと間違われる可能性がある場合に役立ちます。
' <schema> ... </schema> ' 検索CQLのみ:単一引用符( ' )でXMLスキーマ宣言全体を囲みます。
@xml_entity='xml_entity_type' 検索CQLのみ:スキーマ・ファイルおよびsolrConfigファイル内のXML要素を上書きするための実体とリテラル値を示します。
index_name
任意指定のインデックス識別子。インデックス名が指定されていない場合は、「table_name_column_name_idx」という名前がDataStax Enterpriseによって指定されます。特殊文字を使用する場合や大文字と小文字の区別を維持する場合は、引用符で囲みます。

クラスター化カラムを対象としたインデックスの作成

複合パーティション・キーを持つテーブルを定義し、クラスター化カラムを対象としたインデックスを作成します。

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)
);
CREATE INDEX rank_idx ON cycling.rank_by_year_and_name (rank);

セット・コレクションまたはリスト・コレクションを対象としたインデックスの作成

セット・コレクションまたはリスト・コレクション・カラムを対象としたインデックスを、他のカラムの場合と同様に作成します。CREATE INDEX文の末尾でコレクション・カラムの名前を丸かっこで囲んで指定します。たとえば、チームのコレクションをcyclist_career_teamsテーブルに追加して、teamsセットのデータのインデックスを作成します。

CREATE TABLE cycling.cyclist_career_teams (
  id UUID PRIMARY KEY,
  lastname text,
  teams set<text>
);
CREATE INDEX teams_idx ON cycling.cyclist_career_teams (teams) ;

マップ・キーを対象としたインデックスの作成

マップ・コレクション・キーを対象としたインデックスを作成できます。コレクションのマップ値のインデックスが存在する場合は、マップ・コレクション・キーを対象としたインデックスを作成する前に、そのインデックスを削除します。cyclistテーブルに以下のマップ・データが含まれていると仮定します。
{'nation':'CANADA' }
マップ・キーはコロンの左側にあり、マップ値はコロンの右側にあります。

マップ・キーのインデックスを作成するには、ネストした丸かっこの中にKEYSキーワードとマップ名を入れます。

CREATE INDEX team_year_idx
ON cycling.cyclist_teams ( KEYS (teams) );

テーブルをクエリーするには、WHERE句でCONTAINS KEYを使用します。

SELECT *
FROM cycling.cyclist_teams
WHERE teams CONTAINS KEY 2015;

この例では、2015年のエントリーが含まれているサイクリスト・チームが返されます。

 id                                   | firstname | lastname   | teams
--------------------------------------+-----------+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 cb07baad-eac8-4f65-b28a-bddc06a0de23 | Elizabeth | ARMITSTEAD | {2011: 'Team Garmin - Cervelo', 2012: 'AA Drink - Leontien.nl', 2013: 'Boels:Dolmans Cycling Team', 2014: 'Boels:Dolmans Cycling Team', 2015: 'Boels:Dolmans Cycling Team'}
 5b6962dd-3f90-4c93-8f61-eabfa4a803e2 |  Marianne |        VOS |                                                                                          {2014: 'Rabobank-Liv Woman Cycling Team', 2015: 'Rabobank-Liv Woman Cycling Team'}

マップ・エントリーを対象としたインデックスの作成

マップ・エントリーを対象としたインデックスを作成できます。ENTRIESインデックスは、既存のインデックスを含まないテーブルのマップ・カラムにのみ作成できます。

コレクション・エントリーのインデックスを作成するには、ネストした丸かっこの中にENTRIESキーワードとマップ名を入れます。
CREATE INDEX blist_idx
ON cycling.birthday_list ( ENTRIES(blist) );

テーブルでマップ・エントリーをクエリーするには、マップ名と値を含んでいるWHERE句を使用します。

SELECT *
FROM cycling.birthday_list
WHERE blist['age'] = '23';

この例では、同じ年齢のサイクリストを検出します。

 cyclist_name     | blist
------------------+----------------------------------------------------------
   Claudio HEINEN | {'age': '23', 'bday': '27/07/1992', 'nation': 'GERMANY'}
 Laurence BOURQUE |  {'age': '23', 'bday': '27/07/1992', 'nation': 'CANADA'}
同じインデックスを使用して、同じ出身国のサイクリストを検出します。
SELECT *
FROM cycling.birthday_list
WHERE blist['nation'] = 'NETHERLANDS';
 cyclist_name  | blist
---------------+--------------------------------------------------------------
 Luc HAGENAARS | {'age': '28', 'bday': '27/07/1987', 'nation': 'NETHERLANDS'}
   Toine POELS | {'age': '52', 'bday': '27/07/1963', 'nation': 'NETHERLANDS'}

マップ値を対象としたインデックスの作成

マップ値のインデックスを作成するには、ネストした丸かっこの中にVALUES キーワードとマップ名を入れます。
CREATE INDEX blist_values_idx
ON cycling.birthday_list ( VALUES(blist) );

テーブルをクエリーするには、マップ名と値を含んでいるWHERE句を使用します。

SELECT *
FROM cycling.birthday_list
WHERE blist CONTAINS 'NETHERLANDS';
 cyclist_name  | blist
---------------+--------------------------------------------------------------
 Luc HAGENAARS | {'age': '28', 'bday': '27/07/1987', 'nation': 'NETHERLANDS'}
   Toine POELS | {'age': '52', 'bday': '27/07/1963', 'nation': 'NETHERLANDS'}

frozenコレクションのコンテンツ全体のインデックスの作成

FROZENコレクション全体を対象としたインデックスを作成できます。FULLインデックスは、既存のインデックスを含まないテーブルのセット、リスト、またはマップのカラムを対象に作成できます。

FROZEN リストのコンテンツ全体のインデックスを作成します。この例のテーブルは、サイクリストのプロ優勝の数、出場したグランド・ツアー・レースおよびクラシック・レースの数を格納します。

CREATE TABLE cycling.race_starts (
  cyclist_name text PRIMARY KEY,
  rnumbers FROZEN<LIST<int>>
);
コレクション・エントリーのインデックスを作成するには、ネストした丸かっこの中にFULLキーワードとコレクション名を入れます。たとえば、frozenリスト、rnumbersのインデックスを作成します。
CREATE INDEX rnumbers_idx
ON cycling.race_starts ( FULL(rnumbers) );

テーブルをクエリーするには、コレクション名と値を含んでいるWHERE句を使用します。

SELECT *
FROM cycling.race_starts
WHERE rnumbers = [39, 7, 14];
 cyclist_name   | rnumbers
----------------+-------------
 John DEGENKOLB | [39, 7, 14]