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

PolarDB:Panda Index: デッドロックを防止するための一意キーインデックス

最終更新日:Jan 07, 2026

PolarDB-X は、Panda Index と呼ばれる次世代のマルチバージョン一意キーインデックスを提供します。従来の MySQL 非クラスター化インデックスのパフォーマンスボトルネックに対処するために、Panda Index はネイティブの Multi-Version Concurrency Control (MVCC) 機能を使用して、クロスインデックス検索のオーバーヘッドを回避します。また、グローバルな範囲制約のチェックを行レベルロックの粒度に最適化し、ロック範囲の拡散を効果的に防止します。

前提条件

ご利用のインスタンスは、次のバージョン要件を満たす必要があります:

  • インスタンス エディションStandard Edition または Enterprise Edition

  • エンジンバージョンMySQL 8.0

  • データノードバージョン:xcluster8.4.20-20250527 以降。これは、2025 年 5 月 27 日以降にリリースされたバージョンに相当します。

    説明

課金

Panda Index 機能は無料です。ただし、Panda Index は一意なインデックスレコードごとに 28 バイトのオーバーヘッドを追加します。ほとんどのテーブルでは、これによりストレージがわずかに増加し (通常は 5% 未満)、それに応じてストレージコストも増加します。

注意事項

  • インスタンスのバージョン: Panda Index は基盤となるストレージ構造の変更を伴うため、Panda Index を使用するインスタンスは、Panda Index をサポートしていない以前のバージョンにダウングレードすることはできません。

  • 既存のインデックスの処理:既存の一意キー (UK) を持つテーブルの場合、Panda Index 機能を有効にしても、キーは自動的に Panda Index に変換されません。既存の一意キーを Panda Index に変換するには、次のようにインデックスを再構築する必要があります。

    1. 新しいインデックスの作成:ALTER TABLE ... ADD UNIQUE INDEX idx_new ...;

    2. インデックス名の変更:ALTER TABLE ... RENAME idx TO idx_old, RENAME INDEX idx_new TO idx;

    3. 元のインデックスの削除:ALTER TABLE ... DROP INDEX idx_old;

  • 分離レベルPanda Index は、主に Read Committed (RC) 分離レベルでのギャップロックを排除するように設計されています。Repeatable Read (RR) 分離レベルでは、システムは反復可能な読み取りを保証するために、引き続き Next-Key ロック (レコードロック + ギャップロック) を使用する必要があります。したがって、Panda Index はこのレベルではギャップロックを防ぐことができません。

  • サポートされていないテーブルとインデックスPanda Index は、一時テーブル、システムテーブル、圧縮テーブル、または複数値インデックスでは使用できません。

Panda Index の使用方法

1. Panda Index 機能の有効化

PolarDB-X コンソールに移動します。対象クラスターの 構成と管理 > パラメータ設定 ページの ストレージレイヤー タブで、opt_index_format_panda_enabled パラメーターを ON に設定します。この変更は、インスタンスを再起動することなく、すぐに有効になります。

説明
  • 2025 年 6 月 4 日 00:00:00 (UTC+08:00) 以降に購入された新しいインスタンスでは、Panda Index 機能がデフォルトで有効になっています。

  • opt_index_format_panda_enabled パラメーターを ON に設定すると、新しいテーブルと一意なインデックスに対して、デフォルトで Panda Index が作成されます。

  • opt_index_format_panda_enabled パラメーターを OFF に設定すると、MySQL Community Edition と互換性のある標準の一意なインデックスがデフォルトで作成されます。

image

2. Panda Index の効果の検証

簡単な同時実行シナリオで効果を検証できます。

データの準備

-- テーブルと一意キーインデックスを作成します。
CREATE TABLE t1(
  id int,
  c1 int,
  PRIMARY KEY(id),
  UNIQUE KEY uk1(c1)
) SINGLE /* この例では、Enterprise Edition のシングルテーブルを使用します。Standard Edition インスタンスではこれは必須ではありません。 */;

-- データを挿入します。
INSERT INTO t1 VALUES (1,1);
INSERT INTO t1 VALUES (100,100);

同時実行テスト

トランザクション (セッション 1) で、レコードを削除してから新しいレコードを挿入し、一般的な「削除してから更新」操作をシミュレートします。

BEGIN;
DELETE FROM t1 where id=1;
INSERT INTO t1 values (2,1);

同時に、別のトランザクション (セッション 2) で、競合しないレコードをデータギャップに挿入します。

INSERT INTO t1 values (3,2);

この時点で、標準の一意なインデックスと Panda Index の動作は異なります。

  • 標準の一意なインデックスの場合:セッション 2 の挿入操作は失敗します。セッション 1 が保持しているギャップロックを待機している間にブロックされ、最終的にタイムアウトします。

    mysql> INSERT INTO t1 values (3,2);
    
    -- エラーメッセージには次のキーワードが含まれています:Lock wait timeout exceeded; try restarting transaction

    Standard Edition インスタンスでは、ロック情報に一意キー uk1 のギャップロックが含まれていることがわかります。

    SELECT lock_data, lock_mode FROM performance_schema.data_locks WHERE index_name ='uk1';
    +-----------+---------------+
    | lock_data | lock_mode     |
    +-----------+---------------+
    | 1, 1      | X,REC_NOT_GAP |
    | 1, 1      | S,GAP         |
    | 100, 100  | S,GAP         |
    | 1, 2      | S,GAP         |
    +-----------+---------------+
  • Panda Index の場合Panda Index は不要なギャップロックを作成しないため、セッション 2 の挿入操作はすぐに成功します。

    mysql> INSERT INTO t1 values (3,2);
    
    Query OK, 1 row affected (0.00 sec)

    Standard Edition インスタンスでは、ロック情報に一意キー uk1 のギャップロックが含まれていないことがわかります。

    SELECT lock_data, lock_mode FROM performance_schema.data_locks WHERE index_name ='uk1';
    +-----------+---------------+
    | lock_data | lock_mode     |
    +-----------+---------------+
    | 1, 2      | X,REC_NOT_GAP |
    +-----------+---------------+

よくある質問

インスタンスのスペックアップ後、既存の一意キーは自動的に Panda Index に変換されますか?

いいえ、変換されません。Panda Index は基盤となるストレージ構造の変更を伴います。インスタンスのスペックアップ後、既存の一意キーを Panda Index に変換するには、インデックスを再構築する必要があります。これを行うには、ALTER TABLE ... DROP INDEX ...; ALTER TABLE ... ADD UNIQUE INDEX ...; コマンドを使用します。

Panda Index を有効にした後も、一意キーのギャップロックが原因でデッドロックが発生するのはなぜですか?

これは、分離レベルが Repeatable Read に設定されている場合に発生する可能性があります。

Panda Index は、MySQL が Read Committed (RC) 分離レベルで一意性制約を適用するために追加するギャップロックを排除します。ただし、Repeatable Read (RR) 分離レベルでは、データベースは反復可能な読み取りを保証するために Next-Key ロック (レコードロック + ギャップロック) を使用する必要があります。Panda Index は、RR モードでこれらの必要なギャップロックを防ぐことはできません。詳細については、「Bug #68021」をご参照ください。

Panda Index のパラメーター opt_index_format_panda_enabled を有効にすることに関連するリスクはありますか?

このパラメーターの有効化または無効化はリスクがなく、インスタンスの再起動を必要とせず、既存のサービスに影響を与えません。

Panda Index はどのテーブルタイプとデータベースモードをサポートしていますか?

Panda Index は、Standard EditionEnterprise Edition の両方でサポートされています。

Enterprise Edition では、Panda Index はパーティションテーブル、シングルテーブル、ブロードキャストテーブル、および DRDS モードまたは AUTO モードのデータベースでサポートされています。

Panda Index を使用すると、パフォーマンスオーバーヘッドが発生しますか?

いいえ、発生しません。Panda Index はパフォーマンスオーバーヘッドを引き起こしません。実際、ベンチマークテストでは、さまざまなシナリオでパフォーマンスが向上することが示されています。唯一のトレードオフは、通常 5% 未満のわずかなストレージ領域の増加です。