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