Lindorm は、2 種類の効率的で使いやすいインデックスを提供します。セカンダリインデックスと検索インデックスです。これらのインデックスは、プライマリキーが一致に使用されないクエリと多次元クエリに個別に適用できます。CREATE INDEX 構文を使用してインデックスを作成する場合、インデックスタイプを指定し、インデックスに属性を追加できます。
適用可能なエンジンとバージョン
CREATE INDEX 構文は、LindormTable のすべてのバージョンに適用できます。
CREATE INDEX 構文を使用して [検索インデックス] または [列ストアインデックス] を作成するには、Lindorm SQL のバージョンが 2.6.1 以降である必要があります。 Lindorm SQL バージョンの表示方法の詳細については、「SQL バージョン」をご参照ください。
構文
create_index_statement ::= CREATE INDEX [IF NOT EXISTS] [ index_identifier ]
[ USING index_method_definition ]
ON table_identifier '(' index_key_expression ')'
[ INCLUDE include_expression]
[ PARTITION BY partition_definition ]
[ { ASYNC | SYNC} ]
[ WITH '(' index_options ')' ]
index_method_definition ::= { KV | SEARCH | COLUMNAR }
index_key_expression ::= '('
index_key_definition
|wildcard_string_literal
')'
index_key_definition ::= {
column_identifier [ DESC ]
| column_identifier'(' column_options ')'
| function_expression
}
[ (',' index_key_definition)* ]
column_options ::= '('
option_definition (',' option_definition )*
')'
function_expression ::= function_identifier
'('
column_identifer ( ',' column_identifer )*
')'
option_definition ::= option_identifer '=' string_literal
include_expression ::= '('
column_identifier( ',' column_identifier )*
')'
partition_definition ::= {
{RANGE TIME}
'('
column_identifer
')' [ PARTITIONS number_literal ]
|
HASH '('
column_identifer
( ',' column_identifer )*
')' [ PARTITIONS number_literal ]
|
ENUMERABLE
'('
column_identifer
( ',' column_identifer )*
index_options ::= '('
option_definition (',' option_definition )*
')'
サポートされているパラメータ
LindormTable では、CREATE INDEX 構文を使用して、2 種類のインデックス(セカンダリインデックスと検索インデックス)を作成できます。
次の表に、各タイプのインデックスを作成するときにサポートされるパラメータを示します。
パラメータ | セカンダリインデックス | 検索インデックス |
〇 | 〇 | |
〇 | 〇 | |
〇 | ✖️ | |
✖️ | 〇 | |
重要 LindormTable 2.6.3 以降のバージョンのみが | 〇 | 〇 |
〇 | 〇 |
パラメータ
ワイドテーブルには、最大 3 つのセカンダリインデックスと 1 つの検索インデックスを作成できます。
インデックスタイプ(index_method_definition)
インデックスを作成するときに、USING
キーワードを使用して、インデックスタイプを指定できます。次の表に、LindormTable でサポートされているさまざまなタイプのインデックスを作成するときに、このパラメータに設定できる値を示します。
パラメータ値 | インデックスタイプ | 説明 |
KV | セカンダリインデックス | デフォルトでは、 重要 インスタンスに対して同時に作成できるセカンダリインデックスは 8 つだけです。セカンダリインデックスを作成しようとしたときに 8 つのセカンダリインデックスが作成されている場合、インデックスの作成は失敗します。 |
SEARCH | 検索インデックス | 検索インデックスは、LindormSearch に基づく全文検索に使用されます。検索インデックスは、単語分割、あいまい検索、集計分析、ソートとページングなど、複雑な多次元クエリのシナリオに適しています。詳細については、「概要」をご参照ください。 検索インデックスは、DATE、TIME、および DECIMAL を除くすべての基本データ型をサポートしています。サポートされているデータ型の詳細については、「基本データ型」をご参照ください。 重要
|
インデックスキー式(index_key_expression)
1 つの列または複数の列をインデックスキーとして定義できます。複数のインデックスキーで構成されるインデックスは、複合インデックスとも呼ばれます。
インデックスキー定義(index_key_definition)
このパラメータを使用して、検索インデックスのインデックスキーに属性を追加できます。また、このパラメータを使用して、インデックスキーを関数式として指定することもできます。
検索インデックスのインデックスキー属性(option_definition)
ALTER INDEX
構文を使用してインデックス列を追加するときに、インデックスキーの属性を指定できます。たとえば、ALTER INDEX ステートメントで c3(type=text,analyzer=ik)
を指定して c3 列のインデックスを作成し、c3 列に IK アナライザを使用するように指定できます。
次の表に、検索インデックスでサポートされているインデックスキー属性を示します。
属性 | データ型 | 説明 |
indexed | STRING | インデックスキーで指定された列の転置インデックスを作成するかどうかを指定します。
|
rowStored | STRING | 生データを保存するかどうかを指定します。有効な値:
|
columnStored | STRING | 列構造を使用してデータのソートと分析を高速化するかどうかを指定します。有効な値:
|
type | STRING | データ型。アナライザを使用する場合は、関連フィールドのこの属性を text に設定します。他のシナリオでは、デフォルトで、この属性の値をワイドテーブルのデータ型に設定します。 重要 type 属性は、analyzer 属性と一緒に設定する必要があります。 |
analyzer | STRING | 使用するアナライザ。有効な値:
重要 analyzer 属性は、type 属性と一緒に設定する必要があります。 |
mapping | STRING | カスタムインデックスキー属性。この属性の値は、JSON オブジェクトを表す文字列です。この属性は、LindormSearch の構文と互換性があります (Elasticsearch と互換性があります)。 重要
|
セカンダリインデックス関数式(function_expression)
セカンダリインデックスを作成するときに、インデックスキーを関数式として指定できます。サポートされている関数は、Z-ORDER、S2、CAST、MD5、および SHA256 の 5 つです。
重要MD5 または SHA256 関数を含む式をインデックスキーとして指定できるのは、LindormTable 2.6.7.5 以降のバージョンのみです。コンソールで LindormTable をアップグレードできない場合は、テクニカルサポート (DingTalk ID: s0s3eg3) にお問い合わせください。
Z-ORDER: 1 つ以上の時空間列の時空間セカンダリインデックスを作成します。構文:
Z-ORDER '(' column_identifier ( ',' column_identifer )* ')'
column_identifer で指定された列は、時空間列である必要があります。時空間インデックスの詳細については、「時空間インデックス」をご参照ください。
CAST: データ型が変換された列のインデックスを作成します。構文:
CAST(column_identifier AS type)
上記の構文で、type は、列のデータが変換されるデータ型を指定します。詳細については、「基本データ型」をご参照ください。
S2: 時空間データを含む列の S2 セカンダリインデックスを作成します。構文:
S2 '(' column_identifier, level ')'
column_identifer のデータ型は、POLYGON または MULTIPOLYGON である必要があります。level の値の範囲は [1,30] です。詳細については、「S2 インデックス作成関数」をご参照ください。
MD5: VARCHAR データを含む列の MD5 ハッシュのインデックスを作成します。構文:
MD5(column_identifier)
詳細については、「MD5」をご参照ください。
SHA256: VARCHAR データを含む列の SHA256 ハッシュのインデックスを作成します。構文:
SHA256(column_identifier)
詳細については、「SHA256」をご参照ください。
ワイルドカード定数(wildcard_string_literal)
検索インデックスのみがワイルドカード定数 (*) をサポートしています。
ワイルドカード定数 (*) を使用して、すべての列のインデックスを作成できます。例: CREATE INDEX IF NOT EXISTS idx5 USING SEARCH ON test(*);
。
インデックスの作成後にテーブルに追加された列は、検索インデックスまたは列ストアインデックスに自動的に追加されません。
ALTER INDEX
ステートメントを実行して、列をインデックスに手動で追加する必要があります。動的列はインデックスに含まれていません。詳細については、「動的列」をご参照ください。
含まれる列(include_expression)
含まれる列は、ベーステーブルの列と同じインデックス列です。含まれる列を持つインデックスは、カバリングインデックスとも呼ばれます。カバリングインデックスは、ベーステーブルにアクセスすることなく、インデックスにヒットするクエリに必要なすべてのデータを提供できます。これにより、クエリのパフォーマンスを確保できます。
WITH
キーワードを使用して、テーブル属性を追加することで、動的列をセカンダリインデックスに含まれる列として指定できます。詳細については、「セカンダリインデックス」をご参照ください。
インデックスパーティション(partition_definition)
検索インデックスのみがインデックスパーティションをサポートしています。
インデックスパーティションは、サーバーがデータを異なるパーティションに自動的に分割して保存し、データのクエリ時にパーティションをプルーニングするインデックス管理ポリシーです。
検索インデックスは、範囲パーティションとハッシュパーティションをサポートしています。詳細については、「パーティションインデックス」をご参照ください。
インデックス作成方法(ASYNC|SYNC)
CREATE INDEX
構文を使用してインデックスを作成するときに、ASYNC
または SYNC
キーワードを指定して、インデックスを同期的に作成するか、非同期的に作成するかを指定できます。
ASYNC: インデックスを非同期的に作成します。この方法を使用すると、
CREATE INDEX
ステートメントが実行された直後にインデックスの作成が開始されます。インデックスが正常に作成されたかどうかに関係なく、CREATE INDEX
ステートメントへの応答はすぐに返されます。SYNC: インデックスを同期的に作成します。この方法を使用すると、
CREATE INDEX
ステートメントが実行された直後にインデックスの作成が開始されます。インデックスが正常に作成されるまで、CREATE INDEX
ステートメントの結果は返されません。
次の表に、セカンダリインデックスと検索インデックスでサポートされている作成方法を示します。
作成方法 | セカンダリインデックス | 検索インデックス |
ASYNC 重要 LindormTable 2.6.1 以降のバージョンでは、 | 〇 | 〇 |
SYNC 重要 SYNC メソッドは、LindormTable 2.6.3 以降のバージョンでのみサポートされています。 | 〇 | 〇 |
インデックス属性(index_options)
CREATE INDEX
構文を使用してインデックスを作成するときに、WITH
キーワードを使用して、インデックスの属性を指定できます。次の表に、さまざまなタイプのインデックスでサポートされている属性を示します。
セカンダリインデックス
属性 | データ型 | 説明 |
COMPRESSION | STRING | インデックステーブルに使用する圧縮アルゴリズム。有効な値:
|
INDEX_COVERED_TYPE | STRING | インデックスに含まれる列。有効な値:
|
STARTKEY | STRING | インデックスの開始キー。 重要 タイムスタンプ列と時空間列をインデックスの開始キーに設定することはできません。 |
ENDKEY | STRING | インデックスの終了キー。 重要 タイムスタンプ列と時空間列をインデックスの終了キーに設定することはできません。 |
NUMREGIONS | INTEGER | インデックステーブルの推定パーティション数。 重要 この属性は、タイムスタンプ列と時空間列ではサポートされていません。 |
検索インデックス
属性 | データ型 | 説明 |
indexState | STRING | 検索インデックスのステータス。有効な値:
|
numShards | INTEGER | シャードの数。デフォルト値は、検索ノード数の 2 倍です。 |
RANGE_TIME_PARTITION_START | INTEGER | インデックスを作成する前の日数。最初のパーティションは、インデックスを作成した時点の n 日前の時点に基づいて作成されます。日数は n の値です。この属性は、テーブルに履歴データが含まれているシナリオで指定できます。履歴データの行のタイムスタンプが、最初のパーティションの作成に基づく時点より前の場合、エラーメッセージが返されます。 説明 パーティション化されたインデックスを作成する場合は、この属性が必要です。 |
RANGE_TIME_PARTITION_INTERVAL | INTEGER | 新しいパーティションが作成される間隔。たとえば、 説明 パーティション化されたインデックスを作成する場合は、この属性が必要です。 |
RANGE_TIME_PARTITION_TTL | INTEGER | パーティション内のデータの保存期間。たとえば、 説明 パーティション化されたインデックスを作成する場合は、この属性が必要です。 |
RANGE_TIME_PARTITION_MAX_OVERLAP | INTEGER | 書き込むデータのタイムスタンプが将来の時間を示している場合、このオプションは、データが書き込まれた時点とインデックスを作成した時点の間の最大期間を指定します。単位: 日。この属性を指定しない場合、デフォルトでは最大 1 日の将来のデータを書き込むことができます。 |
RANGE_TIME_PARTITION_FIELD_TIMEUNIT | LONG | パーティションキー列の値の単位。デフォルト値: ms。値 ms はミリ秒を意味します。
|
RANGE_TIME_PARTITION_CHS | INTEGER | ホットデータとコールドデータの境界。指定された境界よりも長い期間保存されているデータは、コールドストレージにアーカイブされます。単位: 秒。たとえば、この属性を 説明 この属性を指定しない場合、ホットデータとコールドデータの分離機能は有効になりません。この場合、すべてのデータはデフォルトでホットストレージに保存されます。 |
INDEX_SETTINGS | STRING | カスタムインデックス属性。この属性の値は、JSON オブジェクトを表す文字列です。この属性は、LindormSearch の構文と互換性があります (Elasticsearch と互換性があります)。 重要 INDEX_SETTINGS 属性は、LindormSearch (Elasticsearch と互換性があります) にのみ適用できます。 |
SOURCE_SETTINGS | STRING | 検索インデックス列の生データのストレージポリシー属性。JSON 文字列として定義され、Elasticsearch の
重要
説明
|
例
次の例では、次のステートメントを実行して、test という名前のベーステーブルを作成します。
CREATE TABLE test (
p1 VARCHAR NOT NULL,
p2 INTEGER NOT NULL,
c1 BIGINT,
c2 DOUBLE,
c3 VARCHAR,
c4 TIMESTAMP,
c5 GEOMETRY(POINT),
PRIMARY KEY(p1, p2)
) WITH (CONSISTENCY = 'strong', MUTABILITY='MUTABLE_LATEST');
セカンダリインデックスに関連する例
セカンダリインデックスを非同期的に作成する
デフォルトでは、作成方法を指定しない場合、インデックスは非同期的に作成されます。
CREATE INDEX idx1 ON test(c1 desc) include(c3,c4) WITH (COMPRESSION='ZSTD');
結果を確認する
SHOW INDEX FROM test;
ステートメントを実行して、インデックスが作成されたかどうかを確認できます。
複合インデックスを作成する
c1、c2、および c3 列の複合インデックスを作成します。
CREATE INDEX idx1 ON test(c1, c2, c3) include(c4) SYNC WITH ( COMPRESSION ='ZSTD');
結果を確認する
SHOW INDEX FROM test;
文を実行して、インデックスが作成されたかどうかを確認できます。
すべての列をインデックスに含める
CREATE INDEX idx1 ON test(c4 desc) WITH (INDEX_COVERED_TYPE ='COVERED_ALL_COLUMNS_IN_SCHEMA');
結果を確認する
SHOW INDEX FROM test;
文を実行して、インデックスが作成されたかどうかを確認できます。
すべての動的列をインデックスに含める
CREATE INDEX idx1 ON test(c4 desc) WITH (INDEX_COVERED_TYPE='COVERED_DYNAMIC_COLUMNS');
結果を確認する
SHOW INDEX FROM test;
ステートメントを実行して、インデックスが作成されたかどうかを確認できます。
インデックステーブルの推定パーティション数を設定する
インデックステーブルの推定パーティション数を 32 に設定します。
CREATE INDEX idx1 ON test(c4 desc) include(c5,c6) WITH (NUMREGIONS ='32');
結果を確認する
SHOW INDEX FROM test;
文を実行して、インデックスが作成されたかどうかを確認できます。
インデックステーブルの開始キーと終了キーを指定する
開始キー 11111111
から終了キー 9999999
までの範囲で、インデックステーブルを 32 のパーティションに分割することを指定します。
CREATE INDEX idx1 ON test(c3 desc) include(c5,c6) WITH (NUMREGIONS ='32', STARTKEY ='11111111', ENDKEY = '9999999');
結果を確認する
SHOW INDEX FROM test;
文を実行して、インデックスが作成されたかどうかを確認できます。
Z-ORDER セカンダリインデックスを作成する
POINT データを格納する c5 列の Z-ORDER セカンダリインデックスを作成します。
CREATE INDEX idx1 ON test(Z-ORDER(c5));
結果を確認する
SHOW INDEX FROM test;
ステートメントを実行して、インデックスが作成されたかどうかを確認できます。
S2 セカンダリインデックスを作成する
POINT データを格納する c5 列の S2 セカンダリインデックスを作成します。インデックスは非同期モードでのみ作成できます。
CREATE INDEX idx1 ON test(S2(c5, 10));
S2 セカンダリインデックスを構築します。
BUILD INDEX s2_idx ON test;
結果を確認する
SHOW INDEX FROM test;
ステートメントを実行して、インデックスが作成されたかどうかを確認できます。
指定した列のデータ型を変換する
データ型を INTEGER に変換した後に、c3 列のセカンダリインデックスを作成します。
CREATE INDEX idx1 ON test(CAST(c3 AS INTEGER));
結果を確認する
SHOW INDEX FROM test;
文を実行して、インデックスが作成されたかどうかを確認できます。
検索インデックスに関連する例
セカンダリインデックスを非同期的に作成する
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test(p1, p2, c1, c2, c3);
結果を確認する
SHOW INDEX FROM test;
文を実行して、インデックスが作成されたかどうかを確認できます。
すべての列に検索インデックスを作成する
列属性を指定せずに、すべての列の検索インデックスを作成します。この場合、すべての列属性のデフォルト値が保持されます。
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*');
結果を確認する
SHOW INDEX FROM test;
文を実行して、インデックスが作成されたかどうかを確認できます。
インデックスキーの属性を追加する
インデックスキーにカスタム以外の属性を追加する
すべての列の検索インデックスを作成します。c3 列がインデックスに含まれている場合は、すべてのインデックス列に次の属性を設定します: type=text、analyzer=ik、indexed=true。
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*',c3(type=text,analyzer=ik,indexed=true));
結果を確認する
SHOW INDEX FROM test;
文を実行して、インデックスが作成されたかどうかを確認できます。インデックスキーにカスタム属性を追加する
この例では、次のステートメントを実行して、test という名前のサンプルテーブルを作成します。
CREATE TABLE test ( p1 VARCHAR NOT NULL, p2 INTEGER NOT NULL, c1 BIGINT, c2 DOUBLE, c3 VARCHAR, c4 TIMESTAMP, PRIMARY KEY(p1, p2) ) WITH (CONSISTENCY = 'strong', MUTABILITY='MUTABLE_LATEST');
すべての列の検索インデックスを作成します。c3 列に次の属性を設定します: type=text、analyzer=ik_max_word。
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*',c3(mapping='{ "type": "text", "analyzer": "ik_max_word" }'));
重要mapping 属性は、LindormSearch (Elasticsearch と互換性があります) にのみ適用できます。
mapping 属性を指定すると、インデックスキーの他の属性は無効になります。
結果を確認する
SHOW INDEX FROM test;
文を実行して、インデックスが作成されたかどうかを確認できます。
インデックスステータスを設定する
指定した列に検索インデックスを作成し、インデックス列属性を指定し、検索インデックスのステータスを ACTIVE に設定します。
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test(c1, c3(type=text,analyzer=ik)) WITH (indexState=ACTIVE,numShards=4);
結果を確認する
SHOW INDEX FROM test;
文を実行して、インデックスが作成されたかどうかを確認できます。
カスタムインデックス属性を設定する
検索インデックスを作成し、検索インデックスのステータスを ACTIVE
に設定します。カスタム属性を設定して、圧縮アルゴリズムを ZSTD
に設定し、データを更新する間隔を 10 秒に設定します。
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test(c1, c3(type=text,analyzer=ik)) WITH (indexState=ACTIVE,INDEX_SETTINGS='{
"index": {
"codec": "zstd",
"refresh_interval": "10s"
}
}');
結果を確認する
SHOW INDEX FROM test;
文を実行して、インデックスが作成されたかどうかを確認できます。
時間ベースのパーティションを設定する
時間列 c4 に基づいてパーティションを実行します。パーティションは、30 日前から 7 日ごとに自動的に実行されます。デフォルトでは、パーティションは 90 日間保持されます。
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test (c1, c2, c3, c4)
PARTITION BY RANGE TIME(c4) PARTITIONS 16
WITH (indexState=ACTIVE, RANGE_TIME_PARTITION_START='30', RANGE_TIME_PARTITION_INTERVAL='7', RANGE_TIME_PARTITION_TTL='90', RANGE_TIME_PARTITION_MAX_OVERLAP='90');
結果を確認する
SHOW INDEX FROM test;
文を実行して、インデックスが作成されたかどうかを確認できます。
生データを格納する
デフォルトでは、検索インデックスはデータフィルタリングにのみ使用され、インデックス列の生データは格納されません。検索インデックスを使用しているときに検索エンジンに直接アクセスする必要がある場合は、すべてのインデックス列または一部のインデックス列の生データを格納するように属性を設定できます。
すべてのインデックス列の生データを格納する
c1
、c2
、c3
、c4
列を含む検索インデックスを作成し、すべての列の生データを格納します。CREATE INDEX idx2 USING SEARCH ON test(c1, c2, c3, c4) WITH (SOURCE_SETTINGS=' { "enabled": true } ');
結果の検証
SHOW INDEX FROM test;
文を実行して、インデックスが作成されたかどうかを確認できます。一部のインデックス列の生データを格納する
c1
、c2
、c3
、c4
列を含む検索インデックスを作成し、c2
、c3
、c4
列の生データを格納します。CREATE INDEX idx2 USING SEARCH ON test(c1, c2, c3, c4) WITH (SOURCE_SETTINGS=' { "includes": ["c*"], "excludes": ["c1"] } ');
結果の検証
SHOW INDEX FROM test;
文を実行して、インデックスが作成されたかどうかを確認できます。