このトピックでは、PolarDB-X 1.0のグローバルセカンダリインデックス (GSI) がデータ操作言語 (DML) に与える制限について説明します。
前提条件
カスタムApsaraDB RDS for MySQLインスタンスのバージョンは5.7以降で、PolarDB-X 1.0インスタンスのバージョンは5.4.1以降です。
例
次の表は、GSIがDMLに対して持つ制限を説明するために使用されます。
CREATE TAB_order (
'id' bigint(11) NOT NULL AUTO_INCREMENT、
'order_id' varchar(20) DEFAULT NULL、
'buyer_id 'varchar(20) デフォルトNULL、
'seller_id 'varchar(20) DEFAULT NULL、
'order_snapshot' ロングテキストDEFAULT NULL、
'order_detail' ロングテキストDEFAULT NULL、
主要なキー ('id') 、
ユニークなキー 'l_i_order ' ('order_id') 、
グローバルインデックス 'g_i_seller ' ('seller_id') dbpartition by hash('seller_id') tbpartition by hash('seller_id') 、
グローバルユニークなインデックス 'g_i_buyer ' ('buyer_id') カバー (order_snapshot) dbpartition by hash('buyer_id')
) ENGINE=InnoDB DEFAULT CHARSET=ハッシュによるutf8 dbpartition ('order_id'); GSIのテーブルへの書き込みに失敗すると、テーブルで他のDMLステートメントを実行できなくなり、テーブルでトランザクションをコミットできなくなります。
SET DRDS_TRANSACTION_POLICY='XA';
INSERT INTO t_order(order_id, buyer_id, seller_id) 値 ('order_1 ', 'buyer_1', 'seller_1 ');
# テーブルへのGSIの書き込みに失敗しました。
INSERT IGNORE INTO t_order(order_id, buyer_id, seller_id) 値 ('order_2 ', 'buyer_1', 'seller_1 ');
# 他のDML文はテーブルで実行できません。
INSERT IGNORE INTO t_order(order_id, buyer_id, seller_id) 値 ('order_2 ', 'buyer_2', 'seller_2 ');
# トランザクションはテーブルでコミットできません。
コミット;