CREATE INDEX

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

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

構文

CREATE CUSTOM INDEX IF NOT EXISTS index_name ON keyspace_name.table_name ( KEYS ( column_name ) )(USING class_name) (WITH OPTIONS = map)

制限事項:Using class_nameは、CUSTOMを使用しており、かつclass_nameがjavaクラス名を含む文字列リテラルである場合のみ許可されます。

index_nameは、予約語以外の識別子であり、二重引用符で囲む場合と囲まない場合があります。

mapはマップ・コレクションで、JSON形式のリテラルの配列です。

{ literal :literal, literal :literal ... }

構文の凡例

  • 大文字はリテラルを意味する
  • 小文字は、リテラルでないことを意味する
  • イタリック体は指定が任意であることを意味する
  • パイプ(|)記号はORまたはAND/ORを意味する
  • 省略記号(...)は繰り返し可能を意味する
  • 範囲記号「(」および「)」はリテラルではなく、範囲を示す

この構文には、CQL文の終了となるセミコロンは含まれていません。

説明

CREATE INDEXは、指定されたテーブルに、指定されたカラムの新しいインデックスを作成します。すでに存在しているインデックスを作成しようとすると、IF NOT EXISTSオプションを使用していない限りエラーが返されます。このオプションを使用すると、すでにそのインデックスが存在していれば、この文は何もしません。任意で、ONキーワードの前にインデックスに付ける名前を指定できます。1つのカラム名を丸かっこで囲んで指定します。カラムは現在ある行に存在する必要はありません。テーブルを作成するとき、または後でテーブルを変更して追加するときに、カラムとそのデータ型を指定する必要があります。

ドット表記を使用して、そのテーブルのキースペースを指定できます。キースペース名の後にピリオドを付け、その後にテーブルの名前を記述します。Cassandraは、指定されたキースペースにそのテーブルを作成しますが、現在のキースペースは変更しません。キースペース名を使用しない場合は、現在のキースペース内にそのテーブルのインデックスを作成します。

カラムにデータがすでに存在している場合、Cassandraはこの文の実行中にデータのインデックスを作成します。インデックスを作成した後、Cassandraは、新しいデータの挿入時にカラムの新しいデータのインデックスを自動的に作成します。

Cassandraでは、複合プライマリ・キーのクラスター化カラムを含むほとんどのカラム、またはパーティション(プライマリ)キー自身を対象にインデックスを作成できます。Cassandra 2.1以降では、コレクション、およびコレクション・マップのキーを対象にインデックスを作成できます。コレクションのキーと値の両方を対象にインデックスを作成しようとすると拒否されます。

インデックスの作成はパフォーマンスに大きな影響を与える可能性があります。インデックスを作成する前に、インデックスが作成される場合と作成されない場合について把握しておいてください。

カウンター・カラムのインデックスは作成できません。

Cassandraでは、主に内部使用を目的としたカスタム・インデックスの作成と、カスタム・インデックスに適用するオプションの指定ができます。例:
CREATE CUSTOM INDEX ON users (email) USING 'path.to.the.IndexClass'; CREATE CUSTOM INDEX ON users (email) USING 'path.to.the.IndexClass' WITH OPTIONS = {'storage':'/mnt/ssd/indexes/'};

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

テーブルを定義し、その2つのカラムにインデックスを作成します。

CREATE TABLE myschema.users ( userID uuid, fname text, lname text, email text, address text, zip int, state text, PRIMARY KEY (userID) ); CREATE INDEX user_state ON myschema.users (state); CREATE INDEX ON myschema.users (zip);

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

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

CREATE TABLE mykeyspace.users ( userID uuid, fname text, lname text, email text, address text, zip int, state text, PRIMARY KEY ((userID, fname), state) ); CREATE INDEX ON mykeyspace.users (state);

コレクションでのインデックスの作成

Cassandra 2.1以降では、他のカラムと同じように、コレクション・カラムにインデックスを作成します。CREATE INDEX文の末尾でコレクション・カラムの名前を丸かっこで囲んで指定します。たとえば、電話番号のコレクションをユーザー・テーブルに追加して、phonesセットのデータのインデックスを作成します。

ALTER TABLE users ADD phones set<text>; CREATE INDEX ON users (phones);

コレクションがマップの場合、Cassandraは、マップ値にインデックスを作成します。usersテーブルに、todoマップの例にある以下のマップ・データが含まれていると仮定します。

{'2014-10-2 12:10:00' :'die' }

マップ値はコロンの右側にあります。ここでは'die'です。マップ・キー、つまりタイムスタンプは、コロンの左側にあります。わずかに異なる構文を使用して、インデックスをマップ・キーに作成することもできます。コレクションのマップ・キーのインデックスが存在する場合は、マップ・コレクション値にインデックスを作成する前に、そのインデックスを削除します。

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

Cassandra 2.1以降では、マップ・コレクション・キーにインデックスを作成できます。コレクションのマップ値のインデックスが存在する場合は、マップ・コレクション・キーにインデックスを作成する前に、そのインデックスを削除します。

マップ・キーのインデックスを作成するには、ネストした丸かっこの中にKEYSキーワードとマップ名を入れます。たとえば、usersテーブル内のtodoマップに、コレクション・キー、つまりタイムスタンプのインデックスを作成します。
CREATE INDEX todo_dates ON users (KEYS(todo));

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

マップ・エントリーのインデックスの作成

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

コレクション・エントリーのインデックスを作成するには、ネストした丸かっこの中にENTRIESキーワードとマップ名を入れます。たとえば、raceテーブルのリスト内のコレクション・エントリーのインデックスを作成します。
CREATE INDEX entries_idx ON race (ENTRIES(race_wins));

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

フル・コレクションでのインデックスの作成

Cassandra 2.2以降では、FROZENのフル・コレクションにインデックスを作成できます。FULLインデックスは、既存のインデックスを含まないテーブルのセット、リスト、またはマップのカラムに作成できます。

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

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