CREATE INDEX文

CREATE INDEX文は、指定された表の指定された列に新しい索引を生成します。

構文

create_index_statement ::= 
   CREATE INDEX [IF NOT EXISTS] index_name 
   ON table_name "(" path_list ")" [WITH NO NULLS][comment]

index_name ::= id
path_list ::= index_path ("," index_path)*
index_path ::= 
   name_path [path_type] | 
   multikey_path_prefix [.name_path] [path_type]
name_path ::= field_name ("." field_name)*
field_name ::= id | DSTRING
multikey_path_prefix ::= 
    field_name ( ("." field_name) | ("[" "]") | ("." VALUES"("")" ) )*
    ( ("[" "]") | ("." VALUES"(""")" ) | ("." KEYS"(""")") )
path_type ::= AS 
   (INTEGER | LONG | DOUBLE | STRING | 
   BOOLEAN | NUMBER | ANYATOMIC |POINT | GEOMETRY)

セマンティクス

索引名は表に対して一意です。同じ名前の索引が表にすでに存在する場合、文は失敗し、エラーがレポートされます。たとえば、UserInfo表にはmyindex1という名前の索引のみを含めることができます。

索引名は表に固有です。複数の表で同じ索引名を使用できます。たとえば、UserInfo表とUsers3表で同じ索引名myindex1を使用できます。

索引指定は表に対して一意です。同じ指定の索引が表にすでに存在する場合、文は失敗し、エラーがレポートされます。

たとえば、UserInfo表に次のmyindex1索引がある場合、
CREATE INDEX myindex1 ON UserInfo (info.income AS ANYATOMIC);
次の文は、myindex2索引が別の名前の既存の索引と重複しているというエラーをスローします。この場合、索引名が異なっていても、索引の指定は同じです。
CREATE INDEX myindex2 ON UserInfo(info.income AS ANYATOMIC);

オプションのIF NOT EXISTS句がCREATE INDEX文で指定され、同じ名前の索引が存在する場合、その文は実行されず、エラーはレポートされません。

CREATE INDEX文にオプションのWITH NO NULLS句が指定されている場合、索引付きフィールドにNULL値またはEMPTY値(あるいはその両方)を持つ行は索引付けされません。

WITH NO NULLS句を使用して作成された索引は、索引付けされたフィールドにNULL値またはEMPTY値(あるいはその両方)が大量に含まれている場合に便利です。これにより、索引付け時の時間と領域のオーバーヘッドが削減されます。ただし、問合せによるこのような索引の使用は制限されています。詳細は、「問合せの最適化での索引の使用」の項を参照してください。

オプションのCOMMENTが指定されている場合、これは索引メタデータの一部になり、解釈されません。"comment"は、DESCRIBE文の出力に表示されます。

JSONデータが索引付けされている場合は、JSONデータへのすべての索引パスの横にあるASキーワードを使用してデータ型を指定する必要があります。他のすべての型付きデータの場合、データ型は表スキーマから推測されるため、データ型を指定しないでください。

指定した表で行が挿入、削除または更新されると、索引エントリが自動的に更新されます。

ノート: 行ごとに生成される索引キーの最大数は10000です。生成される行ごとの索引キーの数が10000を超える場合、索引付け時にIllegalArgumentExceptionが発生します。