CREATE INDEX は、LindormTable ワイドテーブルの 1 つ以上の列にインデックスを作成します。これにより、フルテーブルスキャンを行わずに非主キー検索、全文検索、分析クエリを行うことができます。
適用範囲
CREATE INDEX は、LindormTable にのみ適用されます。セカンダリインデックスには最小バージョン要件はありません。
CREATE INDEX を使用して検索インデックスまたは列ストアインデックスを作成するには、Lindorm SQL V2.6.1 以降を使用してください。お使いの Lindorm SQL のバージョンを確認するには、SQL バージョンガイドをご参照ください。
事前準備
セカンダリインデックス、列ストアインデックス、および検索インデックスのインデックス構築ではデータルックアップが行われ、読み取りオペレーションが生成されます。インスタンスでコールド・ホットデータ分離を有効にした場合、コールドストレージにおける容量ストレージの読み取りスロットリングを監視してください。コールドストレージでのスロットリングされた読み取りは、インデックス構築の速度を低下させ、書き込みオペレーションにバックプレッシャーを引き起こす可能性があります。
構文
CREATE INDEX [IF NOT EXISTS] [index_identifier]
[USING {KV | SEARCH | COLUMNAR}]
ON table_identifier '(' index_key_expression ')'
[INCLUDE '(' column_identifier (, column_identifier)* ')']
[PARTITION BY partition_definition]
[{ASYNC | SYNC}]
[WITH '(' index_options ')']サブプロダクション:
index_key_expression ::= index_key_definition (, index_key_definition)*
| wildcard_string_literal
index_key_definition ::= column_identifier [DESC]
| column_identifier '(' option_definition (, option_definition)* ')'
| function_expression
function_expression ::= Z-ORDER '(' column_identifier (, column_identifier)* ')'
| S2 '(' column_identifier, level ')'
| CAST '(' column_identifier AS type ')'
| MD5 '(' column_identifier ')'
| SHA256 '(' column_identifier ')'
partition_definition ::= {RANGE TIME} '(' column_identifier ')' [PARTITIONS number_literal]
| HASH '(' column_identifier (, column_identifier)* ')' [PARTITIONS number_literal]
| ENUMERABLE '(' column_identifier (, column_identifier)* ')'
index_options ::= option_definition (, option_definition)*
option_definition ::= option_identifier = string_literal相違点
サポートされる構文要素は、インデックスタイプによって異なります。
構文要素 | セカンダリインデックス | 検索インデックス |
✔ | ✔ | |
必須 | 必須 | |
✔ | ✖ | |
✖ | ✔ | |
重要
| ✔ | ✔ |
✔ | ✔ |
構文要素 | セカンダリインデックス | 検索インデックス |
| 省略可能 (デフォルト: KV) | 省略可能 |
インデックスキー式 | 必須 | 必須 |
| 省略可能 | サポートされていません |
| サポートされていません | 省略可能 |
| 省略可能 | 省略可能 |
| 省略可能 | 省略可能 |
注意事項
ワイドテーブルごとに、最大 [3] つのセカンダリインデックス、1 つの検索インデックスを作成できます。
インデックスタイプ (USING)
USING キーワードを使用して、インデックスタイプを指定します。省略した場合、デフォルトでセカンダリインデックス (KV) が作成されます。
| インデックスタイプ | 使用するケース |
| セカンダリインデックス | 非主キーの等価検索および範囲検索。インスタンスは最大 8 つの同時セカンダリインデックスビルドタスクをサポートします。9 つ目のリクエストは即座に失敗します。 |
| 検索インデックス | 全文検索、ファジークエリ、多次元フィルタリング、集約、およびページネーション付きのソート。同時ビルドタスク数に制限はありません。事前に検索インデックス機能を有効にする必要があります。検索ノードと Lindorm Tunnel Service (LTS) ノードには料金が発生します。詳細については、「検索インデックスの有効化」をご参照ください。インデックスキーには、少なくとも 1 つの非主キー列を含める必要があります。サポートされているデータ型:DATE、TIME、DECIMAL を除くすべての基本データ型。詳細については、「基本データ型」をご参照ください。 |
インデックスキー式 (index_key_expression)
1 つ以上の列をインデックスキーとして定義します。複数のインデックスキーを持つインデックスは、複合インデックスです。
インデックスキー定義 (index_key_definition)
セカンダリインデックスの場合、各キー定義は次のいずれかです。
列名。オプションで
DESCを指定して降順にすることができます。関数式 (Z-ORDER、S2、CAST、MD5、または SHA256)
検索インデックスの場合、各キー定義は次のいずれかです。
列名。オプションでインデックスキープロパティを指定できます。
既存のすべての列にインデックスを作成するためのワイルドカード定数
*
検索インデックスキープロパティ (option_definition)
構文 column(property=value, ...) を使用して、列ごとにプロパティを指定します。例:c3(type=text, analyzer=ik)。ALTER INDEX ステートメントを使用してインデックス列を追加する際にも、これらのプロパティを指定できます。
プロパティ | タイプ | 説明 |
| STRING | この列にインデックスを構築するかどうかを指定します。文字列列には転置インデックスが構築され、数値列には BKD-Tree 数値インデックスが構築されます。有効な値: |
| STRING | 元の列値を保存するかどうかを指定します。有効な値: |
| STRING | 列ストアを使用してソートと分析を高速化するかどうかを指定します。有効な値: |
| STRING | トークン化された全文検索フィールドの場合は |
| STRING |
|
| STRING | カスタムインデックスキープロパティを JSON 文字列として指定します。Elasticsearch のマッピング構文と互換性があります。Elasticsearch 互換バージョンにのみ適用されます。このキーの他のすべてのプロパティをオーバーライドします。 |
セカンダリインデックス関数式 (function_expression)
セカンダリインデックスを作成する際、関数式をインデックスキーとして指定できます。
MD5 および SHA256 関数式には、LindormTable 2.6.7.5 以降が必要です。アップグレードできない場合は、DingTalk (ID: s0s3eg3) で Lindorm テクニカルサポートにお問い合わせください。
関数 | 構文 | 使用するケース |
Z-ORDER |
| 時空間セカンダリインデックス。列は時空間データ型である必要があります。詳細については、「時空間インデックス」をご参照ください。 |
S2 |
| POLYGON または MULTIPOLYGON 列の S2 グリッドインデックス。 |
CAST |
| データ型変換の結果に対するインデックス。詳細については、「基本データ型」をご参照ください。 |
MD5 |
| VARCHAR 列の MD5 エンコード値に対するインデックス。LindormTable 2.6.7.5 以降が必要です。詳細については、「MD5関数」をご参照ください。 |
SHA256 |
| VARCHAR 列の SHA256 エンコード値に対するインデックス。LindormTable 2.6.7.5 以降が必要です。詳細については、「SHA256関数」をご参照ください。 |
ワイルドカード定数 (wildcard_string_literal)
ワイルドカード定数 * は、検索インデックスでのみサポートされます。* を使用すると、ステートメント実行時に存在するすべての列にインデックスが構築されます。
CREATE INDEX IF NOT EXISTS idx5 USING SEARCH ON test(*);ステートメント実行後に追加された列は、自動的にはインデックス化されません。
ALTER INDEXを使用して手動で追加してください。動的カラムは含まれません。詳細については、「動的カラム」をご参照ください。
付加列 (INCLUDE)
INCLUDE 句は、主テーブルから非キー列をインデックステーブルに追加し、カバリングインデックスを形成します。インデックスにヒットするクエリは、主テーブルを参照せずに付加列の値を取得でき、読み取りパフォーマンスが向上します。
セカンダリインデックスの場合、WITHキーワードを使用してINDEX_COVERED_TYPEを設定することで、動的カラムを含めることができます。詳細については、「セカンダリインデックス」をご参照ください。
インデックスパーティション (PARTITION BY)
インデックスパーティショニングは、検索インデックスでのみサポートされます。サーバーがデータを自動的に分割して保存します。クエリ時には、システムがパーティションプルーニングを適用して、無関係なパーティションをスキップします。
サポートされるパーティションタイプ:RANGE および HASH。詳細については、「パーティションインデックス」をご参照ください。
インデックス構築モード (ASYNC | SYNC)
ASYNC または SYNC を指定して、ステートメントが返されるタイミングを制御します。
モード | 動作 | ステートメントはブロックされますか? | ステートメント完了後すぐにインデックスを使用できますか? | 使用するケース |
| ビルドタスクの開始後、即座に返されます。 | いいえ | いいえ — ビルドはバックグラウンドで継続されます。 | 本番環境。インデックス構築中も書き込みは影響を受けずに継続されます。 |
| ビルドタスクの完了後にのみ返されます。 | はい | はい | スキーマ移行スクリプト、テスト、次のステップの前にインデックスが準備完了している必要がある場合。 |
SYNC には LindormTable 2.6.3 以降が必要です。
次の表は、各インデックスタイプがサポートするモードを示しています。2 種類のセカンダリインデックスと検索インデックスがサポートしています。2 種類
構築モード | セカンダリインデックス | 検索インデックス |
| サポートされています | サポートされています |
| サポートされています | サポートされています |
インデックス構築モード | セカンダリインデックス | 検索インデックス |
ASYNC 重要 LindormTable 2.6.1 以降、 | ✖ | ✖ |
SYNC 重要 LindormTable 2.6.3 以降でのみ同期インデックス構築がサポートされています。 | ✖ | ✔ |
インデックスプロパティ (WITH)
セカンダリインデックスプロパティ
プロパティ | タイプ | 説明 |
| STRING | インデックステーブルの圧縮アルゴリズム。有効な値: |
| STRING | 付加列の冗長化方法。 |
| STRING | インデックステーブルの開始キー。タイムスタンプまたは空間データ型の列には設定できません。 |
| STRING | インデックステーブルの終了キー。タイムスタンプまたは空間データ型の列には設定できません。 |
| INTEGER | インデックステーブルの事前パーティション数。タイムスタンプまたは空間データ型の列には設定できません。 |
検索インデックスプロパティ
プロパティ | タイプ | 説明 |
| STRING | インデックスの初期状態。有効な値: |
| INTEGER | シャード数。デフォルト:検索ノード数の 2 倍。各シャードを 3,000 万~1 億行、30~50 GB の範囲に保ってください。シャードが 20 億行を超えると、システムの安定性に影響します。本番インデックスを作成する前に、シャード数を計画してください。大幅なボリューム増加が見込まれる時系列データ (注文やログなど) の場合は、代わりに時間パーティションインデックスを使用してください。 |
| INTEGER | 履歴データ用に、インデックス作成前の何日前からパーティションの作成を開始するかを指定します。履歴データのタイムスタンプがパーティション開始時刻より前の場合、エラーが発生します。時間パーティションインデックスを作成する場合は必須です。 |
| INTEGER | 新しいパーティション間の間隔 (日数)。たとえば、 |
| INTEGER | データの保持期間 (日数)。たとえば、 |
| INTEGER | 許容される将来のタイムスタンプオフセットの最大値 (日数)。デフォルト:1 日 |
| LONG | 時間パーティションフィールドの単位。デフォルト:ミリ秒 (ms)。単位が秒 (s) の場合、フィールド値は 10 桁である必要があります。単位がミリ秒 (ms) の場合、13 桁である必要があります。 |
| INTEGER | ホット/コールドデータ分離の境界 (秒数)。たとえば、 |
| STRING | カスタムインデックスプロパティを JSON 文字列として指定します。Elasticsearch のインデックス設定構文と互換性があります。Elasticsearch 互換バージョンにのみ適用されます。 |
| STRING | インデックス列の元データ保存ポリシーを、Elasticsearch の |
例
すべての例では、次のプライマリ テーブルを使用します:
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');セカンダリインデックス
インデックスの非同期ビルド
デフォルトのモードは ASYNC です。ステートメントはすぐに戻ります。
CREATE INDEX idx1 ON test(c1 DESC) INCLUDE(c3, c4) WITH (COMPRESSION='ZSTD');結果を確認します:
SHOW INDEX FROM test;複合インデックスの同期作成
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) WITH (NUMREGIONS='32');結果を確認します:
SHOW INDEX FROM test;事前パーティションでの開始キーと終了キーの設定
11111111 と 9999999 の間に、32 個の事前パーティションを持つインデックス テーブルを作成します。
CREATE INDEX idx1 ON test(c3 DESC) INCLUDE(c5)
WITH (NUMREGIONS='32', STARTKEY='11111111', ENDKEY='9999999');結果を確認します:
SHOW INDEX FROM test;Z オーダーセカンダリインデックスの作成
CREATE INDEX idx1 ON test(Z-ORDER(c5));結果を確認します:
SHOW INDEX FROM test;S2 グリッドセカンダリインデックスの作成
S2 インデックスは非同期ビルドのみをサポートします。インデックスを作成した後、BUILD INDEX を実行してビルドを開始します。
CREATE INDEX idx1 ON test(S2(c5, 10));
BUILD INDEX idx1 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;ビルドの進捗を確認するには、「検索インデックスの完全なビルド進捗の表示」をご参照ください。
すべての列のインデックス作成
列のプロパティが指定されていない場合、デフォルト値が適用されます。
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*');ビルドの進捗を確認するには、「検索インデックスの完全なビルド進捗の表示」をご参照ください。
インデックス キー プロパティの追加
すべての列にインデックスを作成し、列 c3 を IK 形態素解析用に設定します:
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*', c3(type=text, analyzer=ik, indexed=true));列 c3 に Elasticsearch 互換のカスタムマッピングを使用するには:
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test('*', c3(mapping='{
"type": "text",
"analyzer": "ik_max_word"
}'));mapping パラメーターは Elasticsearch 互換バージョンにのみ適用され、その列の他のすべてのプロパティを上書きします。
ビルドの進捗を確認するには、「検索インデックスの完全なビルド進捗の表示」をご参照ください。
インデックスの状態とシャード数の設定
CREATE INDEX IF NOT EXISTS idx2 USING SEARCH ON test(c1, c3(type=text, analyzer=ik))
WITH (indexState=ACTIVE, numShards=4);ビルドの進捗を確認するには、「検索インデックスの完全なビルド進捗の表示」をご参照ください。
カスタムインデックスの設定
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"
}
}');ビルドの進捗を確認するには、「検索インデックスの完全なビルド進捗の表示」をご参照ください。
時間パーティション検索インデックスの作成
列 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'
);ビルドの進捗を確認するには、「検索インデックスの完全なビルド進捗の表示」をご参照ください。
検索インデックスへの生データの格納
デフォルトでは、検索インデックスはデータをフィルタリングしますが、列の生データは格納しません。検索エンジンを介して直接クエリを実行するには、生データの格納を有効にする必要があります。
すべてのインデックス 列を格納する場合:
CREATE INDEX idx2 USING SEARCH ON test(c1, c2, c3, c4)
WITH (SOURCE_SETTINGS='{
"enabled": true
}');結果を確認します:
SHOW INDEX FROM test;列のサブセット (c2、c3、c4、c1 を除く) を格納する場合:
CREATE INDEX idx2 USING SEARCH ON test(c1, c2, c3, c4)
WITH (SOURCE_SETTINGS='{
"includes": ["c*"],
"excludes": ["c1"]
}');結果を確認します:
SHOW INDEX FROM test;ビルドの進捗を確認するには、「検索インデックスの完全なビルド進捗の表示」をご参照ください。