OceanBaseデータベースは、ローカルインデックスとグローバルインデックスをサポートしています。本記事では、主にローカルインデックスとグローバルインデックスの概念、およびインデックス作成時のデフォルト動作について説明します。
ローカルインデックス
パーティションテーブルのローカルインデックスは、非パーティションテーブルのインデックスと類似しており、インデックスのデータ構造は依然としてメインテーブルのデータ構造と一対一の関係を保ちます。しかし、メインテーブルがパーティション化されているため、メインテーブルの各パーティションには独自のインデックスデータ構造が存在します。各インデックスデータ構造において、含まれるキー(Key)は自身のパーティション内のメインテーブルデータにのみマッピングされ、他のパーティションのメインテーブルデータにはマッピングされません。このため、この種のインデックスはローカルインデックスと呼ばれます。
別の観点から見ると、このモードではインデックスのデータ構造もパーティション処理が施されているため、ローカルパーティションインデックス(Local Partitioned Index)と呼ばれることもあります。ローカルインデックスの構造は以下の図のとおりです。
上の図では、employee テーブルは emp_id に基づいてRangeパーティションに分割されており、同時に emp_name にローカルインデックスが作成されています。
グローバルインデックス
パーティションテーブルのローカルインデックスと比較すると、パーティションテーブルのグローバルインデックスは、メインテーブルのパーティションと一対一の関係を保たなくなります。代わりに、すべてのメインテーブルパーティションのデータを一つの全体として扱い、インデックス内の一つのキーが複数のメインテーブルパーティションのデータにマッピングされる場合があります(インデックスキーに重複値が存在する場合)。さらに進んで、グローバルインデックスは独立したデータ分布モードを定義でき、非パーティションモードとパーティションモードのいずれかを選択できます。パーティションモードでは、パーティションの分割方法はメインテーブルと同じでも異なっても構いません。
そのため、グローバルインデックスは以下の二つの形式に分けられます:
グローバル非パーティションインデックス(Global Non-Partitioned Index)
インデックスデータはパーティション化せず、単一のデータ構造を保持し、非パーティションテーブルのインデックスと類似しています。しかし、メインテーブルがパーティション化されているため、インデックス内の特定のキーが異なるメインテーブルパーティションにマッピングされる、つまり一対多の対応関係が生じる場合があります。グローバル非パーティションインデックスの構造は以下の図のとおりです。
グローバルパーティションインデックス(Global Partitioned Index)
インデックスデータは指定された方法でパーティション処理を行い、例えばHashパーティションやRangeパーティションに分割して、インデックスデータを異なるパーティションに分散します。ただし、インデックスのパーティションモードは完全に独立しており、メインテーブルのパーティションとは一切関係ありません。そのため、各インデックスパーティションにおいて、特定のキーが異なるメインテーブルパーティションにマッピングされる可能性があります(インデックスキーに重複値が存在する場合)。インデックスパーティションとメインテーブルパーティションの間には多対多の対応関係があります。グローバルパーティションインデックスの構造は以下の図のとおりです。
上の図では、
employeeテーブルはemp_idに基づいてRangeパーティションに分割されており、同時にemp_nameにグローバルパーティションインデックスが作成されています。同一のインデックスパーティション内のキーが、異なるメインテーブルパーティションを指していることが確認できます。
グローバルインデックスのパーティションモードはメインテーブルのパーティションモードと全く関係がないため、グローバルインデックスは独立した別のテーブルのように見えます。そのため、グローバルインデックスは「インデックステーブル」と呼ばれることもあり、理解しやすくなります(メインテーブルに対応するものとして)。
説明
非パーティションテーブルにもグローバルパーティションインデックスを作成できます。ただし、メインテーブルにパーティション分割の必要がない場合、一般的にインデックスにパーティション分割を行う必要もありません。
グローバルインデックスの使用を推奨するシナリオは以下のとおりです:
業務上、主キー以外にもグローバル一意性を強く要求される列の組み合わせが存在し、この業務要件はグローバルな一意インデックスによってのみ実現できる場合。
業務クエリではパーティションキーの条件述語を取得できず、かつ業務テーブルに高並行性の同時書き込みがないため、全パーティションのスキャンを回避するために、クエリ条件に基づいてグローバルインデックスを構築できます。必要に応じて、このグローバルインデックスを新しいパーティションキーに基づいてパーティショニングすることもできます。
注意点として、グローバルインデックスはグローバルに一意であり、データの再パーティショニングを可能にすることで、異なる次元に基づいてクエリを実行するという業務上の強い要件を解決します。しかし、その代償として、すべてのデータ書き込みがマシンをまたいだ分散トランザクションになる可能性があり、高並行性の書き込みシナリオではシステムの書き込み性能に影響を与えます。業務クエリでパーティションキーの条件述語を利用できる場合、OceanBaseデータベースは依然としてローカルインデックスの構築を推奨します。これにより、データベースオプティマイザーのパーティションプルーニング機能を通じて、条件に合致しないパーティションを除外できます。この方法は、クエリと書き込みの両方の性能を兼ね備えることができ、システム全体の性能を向上させることができます。
インデックス作成時のデフォルト動作
ユーザーがインデックスを作成する際に LOCAL または GLOBAL キーワードを指定しない場合、パーティションテーブルにはデフォルトでローカルインデックス(LOCAL)が作成されます。