Lindorm は、2 つ の効率的で使いやすいインデックス (セカンダリインデックス、検索インデックス) を提供します。これらのインデックスは、プライマリキー以外での照合、多次元クエリ、 などのさまざまなシナリオに適しています。CREATE INDEX 構文を使用して、インデックスタイプを指定し、インデックスプロパティを追加できます。
エンジンとバージョン
CREATE INDEX 構文は LindormTable にのみ適用されます。バージョン制限はありません。
CREATE INDEX 構文を使用して検索インデックスを作成するには、Lindorm SQL V2.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種類のインデックスをサポートしています。
サポートされている構文要素はインデックスタイプによって異なります。以下の表でその違いを説明します。
構文要素 | セカンダリインデックス | 検索インデックス |
✔ | 0 | |
✔ | 0 | |
0 | ✖ | |
✖ | 0 | |
重要 LindormTable 2.6.3 以降のバージョンのみが | 0 | 0 |
0 | 0 |
利用上の注意
各ワイドテーブルには、最大 3 つのセカンダリインデックス、1 つの検索インデックスを作成できます。
インデックスタイプ (index_method_definition)
インデックスを作成する際に、USING キーワードを使用してインデックスタイプを指定できます。LindormTable は、以下の 3 つのインデックスタイプをサポートしています。
パラメーター | インデックスタイプ | 説明 |
KV | セカンダリインデックス |
重要 1 つのインスタンスで同時に実行できるセカンダリインデックス構築タスクは、最大 8 つです。すでに 8 つのタスクが実行中の場合にセカンダリインデックスを作成しようとすると、その文は失敗します。 |
検索 | 検索インデックス | 検索エンジンに基づく全文検索インデックスです。主に、トークン化、あいまいクエリ、集約と分析、ページネーション付きのソートなど、複雑な多次元クエリシナリオで使用されます。詳細については、「検索インデックスの概要」をご参照ください。 検索インデックスは、DATE、TIME、DECIMAL を除くすべての基本データの型をサポートします。データの型の詳細については、「基本データの型」をご参照ください。 重要
|
インデックスキー式 (index_key_expression)
1 つまたは複数の列をインデックスキーとして定義できます。複数のインデックスキーを持つインデックスは、複合インデックスと呼ばれます。
インデックスキー定義 (index_key_definition)
インデックスタイプが検索インデックスの場合、インデックスキーにプロパティを追加できます。インデックスタイプがセカンダリインデックスの場合、関数式をインデックスキーとして指定できます。
検索インデックスキーのプロパティ (option_definition)
ALTER INDEX 文を使用してインデックスキー列を追加する際に、インデックスキーのプロパティも指定できます。たとえば、c3(type=text,analyzer=ik) は、列 c3 にインデックスを作成し、この列に ik トークナイザを使用することを指定します。
次の表に、検索インデックスでサポートされているインデックスキーのプロパティを示します。
インデックスキーのプロパティ | タイプ | 説明 |
indexed | STRING | インデックスキーで指定された列のインデックスを作成するかどうかを指定します。文字列型の列には転置インデックスが作成されます。数値型のフィールドには、BKD-Tree インデックスなどの数値インデックスが作成されます。
|
rowStored | STRING | 生データを保存するかどうかを指定します。
|
columnStored | STRING | ソートと分析を高速化するために列ストアを使用するかどうかを指定します。
|
type | STRING | トークン化のシナリオでは、トークン化されるフィールドの type パラメーターを text に設定します。その他の場合、データ型はデフォルトでワイドテーブルのデータ型と同じです。 重要 type パラメーターは analyzer パラメーターと一緒に使用する必要があります。 |
analyzer | STRING | トークナイザのリストを指定します。有効な値:
重要 analyzer パラメーターは type パラメーターと一緒に使用する必要があります。 |
mapping | STRING | カスタムインデックスキーのプロパティで、文字列の JSON オブジェクトとして表されます。これは Elasticsearch インデックスキーのプロパティ構文と互換性があります。 重要
|
セカンダリインデックスの関数式 (function_expression)
セカンダリインデックスを作成する際、関数式をインデックスキーとして指定できます。Z-ORDER、S2、CAST、MD5、SHA256 の 5 つの関数式がサポートされています。
重要LindormTable 2.6.7.5 以降のみが、MD5 または SHA256 関数式をインデックスキーとして使用することをサポートしています。コンソールで LindormTable エンジンをアップグレードできない場合は、DingTalk (s0s3eg3) で Lindorm のテクニカルサポートにご連絡ください。
Z-ORDER 関数:時空間データ型の 1 つ以上の列に対して時空間セカンダリインデックスを作成します。構文は次のとおりです:
Z-ORDER '(' column_identifier ( ',' column_identifer )* ')'column_identifier のデータ型は時空間データ型である必要があります。時空間インデックスの詳細については、「時空間インデックス」をご参照ください。
CAST 関数:列のデータ型変換の結果にインデックスを作成します。構文は次のとおりです:
CAST(column_identifier AS type)type はデータ型です。詳細については、「基本データ型」をご参照ください。
S2 関数:時空間データ型の列に対して S2 グリッドセカンダリインデックスを作成します。構文は次のとおりです:
S2 '(' column_identifier, level ')'column_identifier のデータ型は POLYGON または MULTIPOLYGON である必要があります。level の値の範囲は 1 から 30 です。詳細については、「S2 インデックス関数」をご参照ください。
MD5 関数:VARCHAR 列の MD5 エンコード値にインデックスを作成します。構文は次のとおりです:
MD5(column_identifier)MD5 関数の詳細については、「MD5 関数」をご参照ください。
SHA256 関数:VARCHAR 列の SHA256 エンコード値にインデックスを作成します。構文は次のとおりです:
SHA256(column_identifier)SHA256 関数の詳細については、「SHA256 関数」をご参照ください。
ワイルドカード定数 (wildcard_string_literal)
検索インデックスのみが、ワイルドカード定数 (*) をサポートします。
ワイルドカード定数 (*) は、すべての列にインデックスを構築するために使用されます。例:CREATE INDEX IF NOT EXISTS idx5 USING SEARCH ON test(*)。
文の実行後、新しく追加された列は自動的に検索インデックスに追加されません。
ALTER INDEX文を使用して手動で追加する必要があります。動的カラムはインデックスに含まれません。詳細については、「動的カラム」をご参照ください。
インクルード列 (include_expression)
インクルード列 (カバリングインデックスとも呼ばれる) は、プライマリテーブルのカラムで、インデックステーブルに含まれます。この機能により、クエリがインデックスにヒットした後にプライマリテーブルをルックアップする必要がなくなり、クエリのパフォーマンスが向上します。
セカンダリインデックスの場合、WITH キーワードを使用してテーブルプロパティを追加し、動的カラムをインクルードできます。詳細については、「セカンダリインデックス」をご参照ください。
インデックスパーティション (partition_definition)
検索インデックスのみがインデックスパーティショニングをサポートします。
インデックスパーティショニングはインデックス管理ポリシーです。サーバーサイドで自動的にデータを分割して保存します。データをクエリすると、システムは自動的にパーティションプルーニングを実行します。
検索インデックスは RANGE パーティショニングと HASH パーティショニングに対応しています。詳細については、「パーティションインデックス」をご参照ください。
インデックス構築モード (ASYNC|SYNC)
CREATE INDEX 文を使用してインデックスを作成する際、ASYNC または SYNC キーワードを使用してインデックス構築モードを指定できます。
ASYNC: インデックスを非同期で作成します。
CREATE INDEX文が実行されると、インデックス構築タスクが開始され、インデックスが正常に構築されたかどうかに関わらず、文はすぐに返されます。SYNC: インデックスを同期で作成します。
CREATE INDEX文が実行されると、インデックス構築タスクがすぐに開始されます。CREATE INDEX文は、インデックス構築タスクが完了した後にのみ結果を返します。
次の表では、2 種類のインデックスタイプでサポートされているビルドモードについて説明します。
インデックス構築モード | セカンダリインデックス | 検索インデックス |
ASYNC 重要 LindormTable 2.6.1 以降、 | 0 | 0 |
SYNC 重要 LindormTable 2.6.3 以降でのみ、同期インデックス構築がサポートされています。 | 0 | ✔ |
インデックスプロパティ (index_options)
CREATE INDEX 文を使用してインデックスを作成する際、WITH キーワードを使用してインデックスプロパティを指定できます。次のインデックスプロパティがサポートされています。
セカンダリインデックス
プロパティ | タイプ | 説明 |
COMPRESSION | STRING | インデックステーブルの圧縮アルゴリズム。サポートされているアルゴリズムは次のとおりです:
|
INDEX_COVERED_TYPE | STRING | インデックス冗長化方法には、次の値が利用可能です:
また、 |
STARTKEY | STRING | インデックステーブルの開始キー。 重要 タイムスタンプ列または空間データ型の列に開始キーを設定することはできません。 |
ENDKEY | STRING | インデックステーブルの終了キー。 重要 タイムスタンプ列または空間データ型の列に終了キーを設定することはできません。 |
NUMREGIONS | INTEGER | インデックステーブルの事前パーティションの数。 重要 タイムスタンプ列または空間データ型の列に事前パーティションの数を設定することはできません。 |
検索インデックス
プロパティ | タイプ | 説明 |
indexState | STRING | 検索インデックスの状態。有効な値:
|
numShards | INTEGER | シャードの数を指定します。デフォルト値は検索ノードの数の 2 倍です。 重要 単一シャードのデータ量は 3,000 万行から 1 億行の間、ストレージサイズは 30 GB から 50 GB の間を推奨します。シャードのデータ量が非常に大きい場合、検索インデックスの読み書き性能が低下する可能性があります。さらに、単一シャードにはデータ容量の制限があります。20 億行を超えるとシステムの安定性に影響します。 したがって、本番環境用に検索インデックスを作成する前に、インデックスシャードの数を計画してください。データに時間属性フィールドが含まれ、データ量が時間とともに大幅に増加する場合 (注文データやログデータなど)、時間パーティションインデックスを作成することを推奨します。 |
RANGE_TIME_PARTITION_START | INTEGER | パーティションの作成を開始する、インデックス作成操作の何日前か。これは既存データがあるシナリオに適用されます。既存データのタイムスタンプがパーティション開始時刻より前の場合、エラーが発生します。 説明 このパラメーターは、パーティションインデックスを作成する際に必須です。 |
RANGE_TIME_PARTITION_INTERVAL | INTEGER | 新しいパーティションを作成する間隔 (日数)。たとえば、 説明 このパラメーターは、パーティションインデックスを作成する際に必須です。 |
RANGE_TIME_PARTITION_TTL | INTEGER | パーティションデータを保持する日数。たとえば、 説明 このパラメーターは、パーティションインデックスを作成する際に必須です。 |
RANGE_TIME_PARTITION_MAX_OVERLAP | INTEGER | 書き込み中のデータが未来のタイムスタンプを持つ場合、このパラメーターは現在時刻からの最大許容時間間隔 (日数) を指定します。指定しない場合、デフォルトで 1 日先のデータが許可されます。 |
RANGE_TIME_PARTITION_FIELD_TIMEUNIT | LONG | ビジネスで指定された時間パーティションフィールドの単位。デフォルトの単位はミリ秒 (ms) です。
|
RANGE_TIME_PARTITION_CHS | INTEGER | ホットデータとコールドデータの境界。コールドストレージに転送されるデータの経過時間を指定します。デフォルトの単位は秒 (s) です。たとえば、 説明 このパラメーターが設定されていない場合、コールド・ホットデータ分離は有効になりません。データはデフォルトでホットストレージにのみ保存されます。 |
INDEX_SETTINGS | STRING | カスタムインデックスプロパティで、文字列の JSON オブジェクトとして表されます。これは Elasticsearch インデックス設定構文と互換性があります。 重要 INDEX_SETTINGS パラメーターは、Elasticsearch 互換バージョンにのみ適用されます。 |
SOURCE_SETTINGS | STRING | 検索インデックス列の生データストレージポリシーのプロパティ。これは文字列の JSON オブジェクトであり、Elasticsearch の _source 設定構文と互換性があります。デフォルトでは、検索インデックスはインデックスキー列の生データを保存しません。次のパラメーターがサポートされています:
重要
説明 SOURCE_SETTINGS パラメーターは、検索エンジンの可視化ユーザーインターフェースを通じてデータクエリを実行する必要がある場合にのみ設定します。通常のユースケースでは、このパラメーターを設定する必要はありません。 |
例
プライマリテーブル `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 idx ON roads (Z-ORDER(g1));
CREATE INDEX idt ON roads (Z-ORDER(g1,t));すべての列をインクルード
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 セカンダリインデックスの作成
ポリゴンデータ型列 c5 に Z-ORDER セカンダリインデックスを作成します。
CREATE INDEX idx1 ON test(Z-ORDER(c5));結果の確認
SHOW INDEX FROM test を実行して、インデックスが作成されたかどうかを確認します。
グリッドセカンダリインデックスの作成
ポリゴン型列 c5 にグリッドセカンダリインデックスを作成します。現在、非同期作成モードのみがサポートされています。
CREATE INDEX idx1 ON test(S2(c5, 10));グリッドセカンダリインデックスを構築します。
BUILD INDEX s2_idx ON test;
結果の確認
SHOW INDEX FROM test を実行して、インデックスが作成されたかどうかを確認します。
指定した列のデータ型の変換
列 c3 のデータ型を INTEGER に変換してから、セカンダリインデックスを作成します。
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 を実行して、インデックスが作成されたかどうかを確認します。
Lindorm コンソールでインデックス構築の進捗状況を確認することもできます。詳細については、「検索インデックスのフルビルド進捗の表示」をご参照ください。
すべての列のインデックス作成
すべての列に検索インデックスを作成します。特定の列プロパティが指定されていない場合、デフォルト値が使用されます。
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*');結果の確認
SHOW INDEX FROM test を実行して、インデックスが作成されたかどうかを確認します。
Lindorm コンソールでインデックス構築の進捗状況を確認することもできます。詳細については、「検索インデックスのフルビルド進捗の表示」をご参照ください。
インデックスキープロパティの追加
非カスタムインデックスキープロパティの追加
すべての列に検索インデックスを作成します。インデックスに列 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を実行して、インデックスが作成されたかどうかを確認します。説明Lindorm コンソールでインデックス構築の進捗状況を確認することもできます。詳細については、「検索インデックスのフルビルド進捗の表示」をご参照ください。
カスタムインデックスキープロパティの追加
テーブルスキーマが次のようになっていると仮定します:
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、トークナイザを ik_max_word として指定します。
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*',c3(mapping='{ "type": "text", "analyzer": "ik_max_word" }'));重要mapping パラメーターは、Elasticsearch 互換バージョンにのみ適用されます。
mapping パラメーターを使用する場合、このインデックスキーの他のすべてのパラメーターは無効になります。
結果の確認
SHOW INDEX FROM testを実行して、インデックスが作成されたかどうかを確認します。説明Lindorm コンソールでインデックス構築の進捗状況を確認することもできます。詳細については、「検索インデックスのフルビルド進捗の表示」をご参照ください。
インデックス状態の設定
列と一部の列プロパティを指定し、検索インデックスの状態を 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 を実行して、インデックスが作成されたかどうかを確認します。
Lindorm コンソールでインデックス構築の進捗状況を確認することもできます。詳細については、「検索インデックスのフルビルド進捗の表示」をご参照ください。
カスタムインデックスプロパティの設定
検索インデックスを作成し、検索インデックスの状態を 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 を実行して、インデックスが作成されたかどうかを確認します。
Lindorm コンソールでインデックス構築の進捗状況を確認することもできます。詳細については、「検索インデックスのフルビルド進捗の表示」をご参照ください。
時間パーティションの設定
時間列 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 を実行して、インデックスが作成されたかどうかを確認します。
Lindorm コンソールでインデックス構築の進捗状況を確認することもできます。詳細については、「検索インデックスのフルビルド進捗の表示」をご参照ください。
生データのストレージ設定
検索インデックスはデータフィルタリングにのみ使用され、デフォルトではインデックスキー列の生データを保存しません。検索インデックスを使用する際に検索エンジンに直接アクセスするには、インデックスがインデックスキー列のすべてまたは一部の生データを保存するように設定できます。
すべてのインデックスキー列の生データのストレージ設定
列
c1、c2、c3、c4を含む検索インデックスを作成し、列c1、c2、c3、c4の生データを保存します。CREATE INDEX idx2 USING SEARCH ON test(c1, c2, c3, c4) WITH (SOURCE_SETTINGS=' { "enabled": true } ');結果の確認
SHOW INDEX FROM testを実行して、インデックスが作成されたかどうかを確認します。説明Lindorm コンソールでインデックス構築の進捗状況を確認することもできます。詳細については、「検索インデックスのフルビルド進捗の表示」をご参照ください。
一部のインデックスキー列の生データのストレージ設定
列
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を実行して、インデックスが作成されたかどうかを確認します。説明Lindorm コンソールでインデックス構築の進捗状況を確認することもできます。詳細については、「検索インデックスのフルビルド進捗の表示」をご参照ください。