メインコンテンツまでスキップ

インデックス概要

データベースインデックスは、クエリの高速化に使用されます。異なるクエリシナリオを高速化するため、Dorisは様々な豊富なインデックスをサポートしています。

インデックスの種類と原理

クエリの高速化とその原理の観点から、Dorisのインデックスは主に2つのタイプに分類されます:ポイントクエリインデックスとスキップインデックスです。

  • ポイントクエリインデックス: ポイントクエリの高速化によく使用され、その原理はインデックスを通じてWHERE条件を満たす行を特定し、その行を直接読み取ることです。ポイントクエリインデックスは、条件を満たす行数が少ない場合に非常に効果的です。DorisのポイントクエリインデックスにはPrefix IndexとInverted Indexが含まれます。

    • Prefix Index: Dorisはソートキーに従って順序付けられた方法でデータを格納し、1024行ごとにスパースプレフィックスインデックスを作成します。インデックス内のキーは、現在の1024行の最初の行におけるソートされた列の値です。クエリがソートされた列を含む場合、システムは関連する1024行グループの最初の行を見つけ、そこからスキャンを開始します。

    • Inverted Index: 転置インデックスを持つ列に対して、各値を行IDのセットにマッピングするposting listが作成されます。等価クエリの場合、まずposting listから行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 QueryPrefix Index組み込みインデックス、最高のパフォーマンス。
    テーブルごとに1つのプレフィックスインデックスのみ。
    テーブルごとに1つのプレフィックスインデックスのみ。
    Point QueryInverted Indexトークン化とキーワードマッチングをサポート。
    任意の列にインデックス構築。
    複数条件の組み合わせとより多くの機能の高速化。
    インデックスストレージ容量が大きく、生データと同程度。
    SkipZoneMap Index組み込みインデックス、インデックスストレージ容量が小さい。
    テーブルごとに1つのプレフィックスインデックスのみ。
    テーブルごとに1つのプレフィックスインデックスのみ。
    SkipBloomFilter IndexZoneMapより精密、中程度のインデックス容量。サポートするクエリタイプが少ない。
    等価のみサポート(その他:不等価、範囲、LIKE、MATCHはサポートしない)。
    SkipNGram BloomFilterLIKE高速化をサポート、中程度のインデックス容量。サポートするクエリタイプが少ない。
    LIKE高速化のみサポート。
  • インデックス高速化のための演算子と関数のリスト

    演算子または関数Prefix IndexInverted IndexZoneMap IndexBloomFilter IndexNGram BloomFilter Index
    =YESYESYESYESNO
    !=YESYESNONONO
    INYESYESYESYESNO
    NOT INYESYESNONONO
    >, >=, <, <=, BETWEENYESYESYESNONO
    IS NULLYESYESYESNONO
    IS NOT NULLYESYESNONONO
    LIKENONONONOYES
    MATCH, MATCH_*NOYESNONONO
    array_containsNOYESNONONO
    array_overlapsNOYESNONONO
    is_ip_address_in_rangeNOYESNONONO

インデックス設計ガイドライン

データベーステーブルインデックスの設計と最適化は、データ分布とクエリに密接に関連しており、実際のシナリオに基づいてテストと最適化が必要です。「銀の弾丸」はありませんが、Dorisはインデックス使用の難易度を継続的に削減するよう努めています。ユーザーは、インデックス選択とテストにおいて、これらの簡単なガイドラインに従うことができます。

  1. 最も頻繁に使用されるフィルタ条件をKEYとして指定し、プレフィックスインデックスを自動作成します。これが最高のフィルタリング効果を持ちます。ただし、テーブルごとに1つのプレフィックスインデックスしか作成できないため、最も頻繁なフィルタ条件に使用すべきです。

  2. フィルタ高速化が必要な非キーフィールドについては、広い適用性と複数条件の組み合わせにより、転置インデックスの作成が第一選択です。第二選択には以下の2つのインデックスが含まれます:

    • 文字列LIKEマッチングが必要な場合は、NGram BloomFilterインデックスを追加します。

    • インデックスストレージ容量が重要な場合は、転置インデックスをBloomFilterインデックスに置き換えます。

  3. パフォーマンスが期待通りでない場合は、QueryProfileを通じてインデックスによってフィルタリングされるデータ量と消費時間を分析します。詳細については、各インデックスの詳細ドキュメントを参照してください。