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)が作成されます。