すべてのプロダクト
Search
ドキュメントセンター

PolarDB:グローバルセカンダリインデックス (GSI)

最終更新日:Mar 28, 2026

PolarDB-X の分散テーブルにおいて、パーティションキーを含まないクエリはすべてのデータノードに対してフルスキャンをトリガーします。これによりパフォーマンスがシングルノードの上限にまで低下し、線形スケーリングが失われます。グローバルセカンダリインデックス (GSI) を使用すると、インデックスに対して独立したパーティションスキームを定義できるため、任意の列を効率的なクエリパスにできます。その結果、フルパーティションスキャンを回避できます。

GSI の仕組み

PolarDB-X は、指定されたキーでパーティション分割された複数のデータノードにテーブルデータを格納します。パーティションキーを含むクエリは、該当するパーティションに直接ルートされます。一方、パーティションキーを含まないクエリはすべてのパーティションに分散されます。

システムに N 個のデータノードがある場合、パーティションキーを使用したクエリは各ノードに平均して 1/N の負荷をかけます。一方、フルパーティションスキャンでは各ノードに負荷 1 がかかります。そのため、パフォーマンスの上限がシングルノードレベルまで低下し、システムは線形スケーリング能力を失います。

GSI は、プライマリテーブルから特定の列を複製した特殊なパーティションテーブルとして機能することでこの問題を解決します。GSI は、プライマリテーブルのパーティションキーとは異なるユーザー定義キーによって水平方向にパーティション分割されます。クエリが GSI のパーティションキーと一致する場合、PolarDB-X はそのクエリを該当する GSI パーティションにルートし、一致する行を取得した後、プライマリテーブルから追加の必要な列をフェッチします。これにより、フルパーティションスキャンを回避できます。

GSI architecture diagram

PolarDB-X は、分散トランザクションを使用して、プライマリテーブルとその GSI 間の強固なデータ整合性を維持します。

GSI は以下の機能もサポートしています。

  • オンライン DDL 操作 — テーブルをロックせずに GSI を作成・変更・削除可能

  • カスタムカバリングカラム — GSI 内に追加の列を格納することで、プライマリテーブルへのルックアップを削減または完全に排除可能

  • 非表示インデックス — クエリオプティマイザーに公開せずにクエリプランへの影響をテスト可能。本番環境で有効化する前にインデックスのパフォーマンスを検証できます

GSI の種類

GSI

標準的な GSI は、プライマリテーブルのパーティションキー以外の列でインデックスデータをパーティション分割します。クエリが GSI のパーティションキーと一致する場合、PolarDB-X はそのクエリを該当するパーティションにルートし、残りの列についてはプライマリテーブルを参照します。

例: user テーブルは user_id でパーティション分割されています。name による効率的なクエリをサポートするために、name 上に GSI を作成します。

CREATE TABLE user(
  user_id bigint,
  name varchar(10),
  addr varchar(30),
  GLOBAL INDEX `g_i_name` (name) PARTITION BY HASH(name),
  PRIMARY KEY(user_id)
) PARTITION BY KEY(user_id);

g_i_name が存在する場合、name でフィルターするクエリは user テーブルのすべてのパーティションをスキャンするのではなく、インデックスの該当するパーティションにルートされます。

UGSI

ユニークグローバルセカンダリインデックス (UGSI) は、標準 GSI のすべてのプロパティに加えて、分散テーブル全体にわたってグローバルな UNIQUE 制約を適用します。

例: user2 テーブルは user_id でパーティション分割されています。すべてのパーティションにわたって phone の一意性を保証するために、phone 上に UGSI を作成します。

CREATE TABLE user2(
  user_id bigint,
  phone varchar(20),
  addr varchar(30),
  UNIQUE GLOBAL INDEX `g_i_phone`(phone) PARTITION BY HASH(phone),
  PRIMARY KEY(user_id)
) PARTITION BY KEY(user_id);

クラスタード GSI

デフォルトでは、クラスタード GSI はインデックスキーおよびカバリングカラムだけでなく、プライマリテーブルのすべての列を格納します。すべての列がインデックス内に存在するため、クエリはプライマリテーブルを参照する必要がなくなり、ルックアップオーバーヘッドが完全に排除されます。

トレードオフとして、クラスタード GSI はプライマリテーブルと同じ量のディスク領域を消費します。

例: order_tbl テーブルは order_id でパーティション分割されています。プライマリテーブルへのルックアップなしで user_id による高速クエリをサポートするために、user_id 上にクラスタード GSI を作成します。

CREATE TABLE order_tbl(
  order_id bigint,
  user_id bigint,
  addr varchar(30),
  info text,
  create_time datetime,
  CLUSTERED INDEX `cg_i_user`(user_id) PARTITION BY HASH(user_id),
  PRIMARY KEY(order_id)
) PARTITION BY KEY(order_id);

user_id でクエリを実行する際、PolarDB-X はクエリを cg_i_user の該当するパーティションにルートし、必要なすべてのデータをインデックスから直接読み取ります。

各タイプの使用タイミング

シナリオ推奨タイプ
パーティションキー以外の列でクエリを実行し、プライマリテーブルへのルックアップが許容される場合GSI
パーティションキー以外の列でクエリを実行し、その列が全パーティションで一意である必要がある場合UGSI
パーティションキー以外の列でクエリを実行し、ルックアップオーバーヘッドの排除が優先度の高い場合クラスタード GSI

パフォーマンス

GSI は読み取りパフォーマンスを向上させる一方で、書き込みパフォーマンスを低下させます。以下の Sysbench ベンチマークは、スケール時の影響を示しています。

読み取りパフォーマンス

テーブルスレッド数select_random_ranges QPS平均遅延時間 (ms)95 パーセンタイル (ms)select_random_points QPS平均遅延時間 (ms)95 パーセンタイル (ms)
パーティションテーブル1282,769.1746.2199.335,226.9924.4842.61
2563,415.64144.97144.975,476.7646.7382.96
5123,272.46156.31257.955,290.6796.72179.94
10242,453.16416.12539.715,165.31198.07404.61
パーティションテーブル + GSI1289,662.1113.2425.2822,584.895.669.73
25610,431.7324.5251.0225,558.2610.0117.95
51215,634.5132.7273.1327,116.5618.8639.65
102422,948.7644.53108.6832,509.8731.4373.13

インデックスキー列に GSI を設定した場合:

  • 範囲クエリ QPS:3,415.64 → 22,948.76 — 571 % 向上

  • ポイントクエリ QPS:5,476.76 → 32,509.87 — 493 % 向上

書き込みパフォーマンス

テーブルスレッド数書き込み専用 QPS平均遅延時間 (ms)95 パーセンタイル (ms)読み書き混在 QPS平均遅延時間 (ms)95 パーセンタイル (ms)
パーティションテーブル12886,548.128.8710.27113,655.2822.5226.2
256115,774.7113.2619.29149,677.5234.1944.17
512143,928.9420.5134.9514,555.1670.28112.67
1024153,501.739.5370.55132,150.69131.58287.38
パーティションテーブル + GSI12852,069.2214.2518.2890,074.5928.4133.72
25666,250.7923.1732.53114,420.3244.7357.87
51275,700.7439.159.99111,093.6192.09142.39
102476,557.9480.14134.9101,828.32182.51350.33

インデックスキー列に GSI を設定した場合:

  • 書き込み専用 QPS:153,501.7 → 76,557.94 — 50 % 低下

  • 読み書き混在 QPS:149,677.52 → 114,420.32 — 23 % 低下

次のステップ