OceanBaseデータベースは、ローカルインデックスとグローバルインデックスをサポートしています。本記事では、主にローカルインデックスとグローバルインデックスの概念、およびインデックス作成時のデフォルト動作について説明します。
ローカルインデックス
パーティションテーブルのローカルインデックスは、パーティション化されていないテーブルのインデックスと似ています。インデックスのデータ構造は依然としてメインテーブルのデータ構造と一対一の関係を保っていますが、メインテーブルはすでにパーティション化されているため、メインテーブルの各パーティションごとに独立したインデックスデータ構造が存在します。各インデックスデータ構造において、内部のキー(Key)は自分自身のパーティション内のメインテーブルデータにのみマッピングされ、他のパーティション内のメインテーブルデータにはマッピングされません。このため、このようなインデックスはローカルインデックスと呼ばれます。
別の観点から見ると、このモードではインデックスのデータ構造もパーティション処理が行われているため、時にはローカルパーティションインデックス(Local Partitioned Index)とも呼ばれます。ローカルインデックスの構造は以下の図に示されています。

上記の図では、employee テーブルは emp_id に基づいてRangeパーティションが作成されており、同時に emp_name にもローカルインデックスが作成されています。
グローバルインデックス
パーティションテーブルのローカルインデックスと比較して、パーティションテーブルのグローバルインデックスは、もはや主テーブルのパーティションと一対一の関係を保たず、すべての主テーブルパーティションのデータを一つの全体として扱います。そのため、インデックス内のあるキーが複数の主テーブルパーティションのデータにマッピングされる可能性があります(インデックスキーに重複値が存在する場合)。さらに、グローバルインデックスは独自のデータ分散モードを定義でき、パーティション化されないモードとパーティション化されたモードのいずれかを選択できます。パーティション化されたモードでは、パーティションの分割方法は主テーブルと同じでも、または主テーブルと異なっていても構いません。
したがって、グローバルインデックスには以下の2種類があります:
グローバル非パーティション化インデックス(Global Non-Partitioned Index)
インデックスデータはパーティション化されず、単一のデータ構造を維持し、非パーティション化テーブルのインデックスと似ています。ただし、主テーブルはすでにパーティション化されているため、インデックス内の特定のキーが異なる主テーブルパーティションにマッピングされる場合があり、これは一対多の対応関係です。グローバル非パーティション化インデックスの構造は以下の図のとおりです。

グローバルパーティション化インデックス(Global Partitioned Index)
インデックスデータは指定された方法でパーティション処理が行われ、例えばハッシュ(Hash)パーティションや範囲(Range)パーティションを行い、インデックスデータを異なるパーティションに分散します。しかし、インデックスのパーティションモードは完全に独立しており、主テーブルのパーティションとは一切関係ありません。そのため、各インデックスパーティションにおいて、特定のキーが異なる主テーブルパーティションにマッピングされる可能性があります(インデックスキーに重複値が存在する場合)、インデックスパーティションと主テーブルパーティション間は多対多の対応関係です。グローバルパーティション化インデックスの構造は以下の図のとおりです。

上記の図では、
employeeテーブルはemp_idに基づいてRangeパーティションが行われ、同時にemp_nameにグローバルパーティション化インデックスが作成されています。同一のインデックスパーティション内のキーが、異なる主テーブルパーティションを指していることがわかります。
グローバルインデックスのパーティションモードは主テーブルのパーティションモードとはまったく関係がないため、グローバルインデックスは別の独立したテーブルのように見えます。そのため、グローバルインデックスはインデックステーブルと呼ばれることもあり、理解しやすくなります(主テーブルと対応します)。
説明
非パーティション化テーブルにもグローバルパーティション化インデックスを作成できます。ただし、主テーブルにパーティション化の必要がない場合、一般的にはインデックスをパーティション化する必要もありません。
グローバルインデックスを使用することを推奨されるシナリオは以下のとおりです:
ビジネス上、主キー以外にも他の列の組み合わせがグローバル一意性という強い要件を満たす必要があり、このビジネス要件はグローバル一意インデックスによってのみ実現可能です。
ビジネスのクエリではパーティションキーの条件付き述語を取得できず、かつビジネステーブルに高い同時書き込みが発生しない場合、フルパーティションのスキャンを避けるために、クエリ条件に基づいてグローバルインデックスを構築し、必要に応じて新しいパーティションキーに基づいてグローバルインデックスを再パーティション化することができます。
注意が必要な点として、グローバルインデックスはグローバル一意性を実現し、データの再パーティション化を可能にすることで、異なる次元に基づいてクエリを行うという強いビジネス要件を一部解決しますが、その代償として、各データの書き込みがマシン間の分散トランザクションになる可能性があります。高い同時書き込みが発生するシナリオでは、システムの書き込み性能に影響を与えることになります。ビジネスのクエリがパーティションキーの条件付き述語を持つ場合、OceanBaseデータベースでは依然としてローカルインデックスの構築を推奨します。データベースオプティマイザーのパーティションカット機能を利用して、条件に合致しないパーティションを除外します。このようなアプローチは、クエリと書き込みの両方の性能を考慮し、システム全体のパフォーマンスをより優れたものにすることができます。
インデックス作成時のデフォルト動作
ユーザーがインデックスを作成する際、LOCAL または GLOBAL キーワードを指定しない場合、パーティションテーブル上にはデフォルトでグローバルインデックス(GLOBAL)が作成されます。