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 に変換するには、次のようにインデックスを再構築する必要があります。
新しいインデックスの作成:
ALTER TABLE ... ADD UNIQUE INDEX idx_new ...;インデックス名の変更:
ALTER TABLE ... RENAME idx TO idx_old, RENAME INDEX idx_new TO idx;元のインデックスの削除:
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 と互換性のある標準の一意なインデックスがデフォルトで作成されます。

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 transactionStandard 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 | +-----------+---------------+