インデックスの概要
データベースインデックスはクエリを高速化するために使用されます。さまざまなクエリシナリオを高速化するため、Dorisは豊富な各種インデックスをサポートしています。
インデックスの種類と原理
クエリの高速化とその原理の観点から、Dorisのインデックスは主に2つのタイプに分類されます:ポイントクエリインデックスとスキップインデックスです。
-
ポイントクエリインデックス: ポイントクエリの高速化によく使用され、原理はインデックスを通してWHERE条件を満たす行を特定し、該当する行を直接読み取ることです。条件を満たす行数が少ない場合、ポイントクエリインデックスは非常に効果的です。DorisのポイントクエリインデックスにはPrefix IndexとInverted Indexが含まれます。
-
Prefix Index: Dorisはソートキーに従って順序付けられた方法でデータを保存し、1024行ごとにスパースなプレフィックスインデックスを作成します。インデックス内のキーは、現在の1024行の最初の行におけるソート列の値です。クエリがソート列に関わる場合、システムは関連する1024行グループの最初の行を見つけ、そこからスキャンを開始します。
-
Inverted Index: 転置インデックスを持つ列に対して、各値を行IDのセットにマッピングするポスティングリストが作成されます。等価クエリでは、まずポスティングリストから行IDのセットを見つけ、次にそれらの行のデータを直接読み取り、行ごとのスキャンを回避します。転置インデックスは範囲フィルタリングや全文検索も高速化できます。アルゴリズムはより複雑ですが、基本原理は類似しています。(注:以前のBITMAPインデックスは、より強力な転置インデックスに置き換えられました。)
-
-
スキップインデックス: 分析の高速化によく使用され、原理はインデックスを通してWHERE条件を満たさないデータブロックを判定し、これらのブロックをスキップして、条件を満たす可能性があるデータブロックのみを読み取り、その後行ごとのフィルタを実行して最終的に条件を満たす行を取得することです。条件を満たす行数が多い場合、スキップインデックスはより効果的です。DorisのスキップインデックスにはZoneMapインデックス、BloomFilterインデックス、NGram BloomFilterインデックスが含まれます。
-
ZoneMap Index: 各列の統計情報を自動的に維持し、各データファイル(Segment)およびデータブロック(Page)の最大値、最小値、NULL値の有無を記録します。等価クエリ、範囲クエリ、IS NULLに対して、最大値、最小値、NULL値の有無に基づいて、データファイルとデータブロックが条件を満たすデータを含む可能性があるかを判定できます。含まない場合、Dorisは対応するファイルやデータブロックの読み取りをスキップし、IOを削減してクエリを高速化します。
-
BloomFilter Index: インデックス対象列の値をBloomFilterデータ構造に保存し、非常に少ないストレージ領域で値がBloomFilter内にあるかを素早く判定できます。等価クエリで値がBloomFilter内にない場合、対応するデータファイルやデータブロックをスキップでき、IOを削減してクエリを高速化します。
-
NGram BloomFilter Index: テキストのLIKEクエリ高速化に使用されます。原理はBloomFilterインデックスと似ていますが、元のテキスト値を保存する代わりに、テキストのNGramトークン化を実行し、各トークンをBloomFilterに保存します。LIKEクエリでは、LIKEパターンもNGramを使用してトークン化されます。いずれかのトークンがBloomFilter内にない場合、対応するデータファイルやデータブロックはLIKE条件を満たさないため、スキップできます。
-
上記のインデックスのうち、プレフィックスインデックスとZoneMapインデックスはDorisが自動的に維持する組み込みインデックスで、ユーザーによる管理は不要です。転置インデックス、BloomFilterインデックス、NGram BloomFilterインデックスは、シナリオに基づいてユーザーが手動で作成・管理する必要があります。
-
異なるタイプのインデックスの特性比較
タイプ インデックス 利点 制限事項 Point Query Prefix Index 組み込みインデックス、最高のパフォーマンス。
Tableごとに1つのプレフィックスインデックスのみ。Tableごとに1つのプレフィックスインデックスのみ。 Point Query Inverted Index トークン化とキーワードマッチングをサポート。
任意の列でのインデックス構築。
複数条件の組み合わせとより多くの機能の高速化。インデックスストレージ領域が大きく、生データと同程度。 Skip ZoneMap Index 組み込みインデックス、インデックスストレージ領域が小さい。
Tableごとに1つのプレフィックスインデックスのみ。Tableごとに1つのプレフィックスインデックスのみ。 Skip BloomFilter Index ZoneMapより精密、インデックス領域は中程度。 サポートするクエリタイプが少ない。
等価のみをサポート(その他の不等価、範囲、LIKE、MATCHはサポートしない)。Skip NGram BloomFilter LIKE高速化をサポート、インデックス領域は中程度。 サポートするクエリタイプが少ない。
LIKE高速化のみをサポート。 -
インデックス高速化の演算子と関数のリスト
演算子または関数 Prefix Index Inverted Index ZoneMap Index BloomFilter Index NGram BloomFilter Index = YES YES YES YES NO != YES YES NO NO NO IN YES YES YES YES NO NOT IN YES YES NO NO NO >, >=, <, <=, BETWEEN YES YES YES NO NO IS NULL YES YES YES NO NO IS NOT NULL YES YES NO NO NO LIKE NO NO NO NO YES MATCH, MATCH_* NO YES NO NO NO array_contains NO YES NO NO NO array_overlaps NO YES NO NO NO is_ip_address_in_range NO YES NO NO NO
インデックス設計ガイドライン
データベースTableインデックスの設計と最適化は、データ分布とクエリに密接に関連しており、実際のシナリオに基づいたテストと最適化が必要です。「銀の弾丸」は存在しませんが、Dorisはインデックス使用の難易度を下げるよう継続的に努力しています。ユーザーは以下のシンプルなガイドラインに従って、インデックスの選択とテストを行うことができます。
-
最も頻繁に使用されるフィルタ条件をKEYとして指定し、プレフィックスインデックスを自動作成します。これが最良のフィルタリング効果を持つためです。ただし、Tableごとに1つのプレフィックスインデックスのみ作成できるため、最も頻繁なフィルタ条件に使用すべきです。
-
フィルタ高速化が必要な非キーフィールドについては、幅広い適用性と複数条件の組み合わせができるため、転置インデックスの作成が第一の選択肢です。第二の選択肢には以下の2つのインデックスがあります:
-
文字列のLIKEマッチングが必要な場合、NGram BloomFilterインデックスを追加します。
-
インデックスストレージ領域が重要な場合、転置インデックスをBloomFilterインデックスに置き換えます。
-
-
パフォーマンスが期待通りでない場合、QueryProfileを通してインデックスによってフィルタされるデータ量と消費時間を分析します。詳細については各インデックスの詳細ドキュメントを参照してください。