ローカルインデックスとグローバルインデックスの比較
ローカルインデックスと比較して、グローバルインデックスは独立したパーティションルールを持つため、インデックステーブル内のあるパーティションのインデックス値が、プライマリテーブルの複数のパーティションにまたがるデータに対応する可能性があります。インデックスのパーティションルールとプライマリテーブルのパーティションルールが必ずしも一致しないため、分散環境ではインデックスデータとプライマリテーブルデータの保存場所が常に一緒であるとは限らず、これにより読み書きのRPCコストや分散トランザクションのコストが必然的に発生します。例えば、プライマリテーブルのパーティションとグローバルインデックスのパーティションが同一の物理的場所にない場合、TABLE SCAN演算子がグローバルインデックステーブルのスキャンを実行する際には、プライマリテーブルデータを取得するためにリモートマシンへのRPC操作が含まれます。そのため、グローバルインデックスはローカルインデックスよりも高いメンテナンスコストがかかります。プライマリテーブルのパーティションルールを十分に評価し、適切なパーティションキーを選択し、より多くのクエリ条件がプライマリテーブルのパーティションキーをカバーできるようにすることで、グローバルインデックスの使用をできるだけ避けるべきです。
制限事項
OceanBaseデータベースのテーブルはインデックス組織化テーブル(IOT)であるため、パーティションテーブルにおいては、指定された主キーに基づくクエリが迅速にテーブルのパーティションを特定できるようにするため、パーティションキーは主キーの部分集合である必要があります。パーティションテーブル上にローカルパーティション一意インデックス(Local Partitioned Unique Index)を作成する場合、そのインデックスキーにはプライマリテーブルのパーティションキーが含まれている必要がありますが、グローバルパーティション一意インデックス(Global Partitioned Unique Index)にはこの制限はありません。
例:
obclient> CREATE TABLE test(pk int,c2 int ,c3 int, PRIMARY KEY(pk)) PARTITION BY hash(pk) partitions 5;
Query OK, 0 rows affected
obclient> CREATE UNIQUE INDEX idx ON test(c2) LOCAL;
ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function
obclient> CREATE UNIQUE INDEX idx ON test(c2, pk) LOCAL;
Query OK, 0 rows affected
obclient> DROP INDEX idx ON test;
Query OK, 0 rows affected
obclient> CREATE UNIQUE INDEX idx ON test(c2) GLOBAL;
Query OK, 0 rows affected