グローバルセカンダリインデックス (GSI) には、作成方法、GSI を含むテーブルの変更方法、DDL および DML 操作の実行方法に関して特定の制約があります。これらの制約を事前に理解することで、スキーマ設計のエラーやランタイムでの予期せぬ障害を回避できます。
GSI の作成に関する制約
GSI は ApsaraDB RDS for MySQL 5.6 ではサポートされていません。
GSI は単一テーブルまたはブロードキャストテーブルには作成できません。
GSI はプライマリキーのないテーブルには作成できません。
プレフィックスインデックスは UNIQUE GSI では使用できません。
インデックステーブルを作成する際は、インデックス名を指定する必要があります。
インデックステーブルを作成する際は、データベースシャーディングルールのみ、またはデータベースシャーディングとテーブルシャーディングの両方のルールを指定します。テーブルシャーディングルールのみの指定、またはシャーディングルールを全く指定しないことは許可されていません。
インデックステーブルのインデックス列には、すべてのシャードキーを含める必要があります。
GSI 名は、プライマリテーブル内のどのローカルインデックスの名前とも重複できません。
GSI の定義では、インデックス列とカバーリング列は互いに異なる必要があります。
デフォルトでは、インデックステーブルにはプライマリテーブルのすべてのプライマリキーとシャードキーが含まれます。インデックス列として明示的にリストされていないプライマリキーまたはシャードキーは、自動的にカバーリング列に追加されます。
プライマリテーブルの各ローカルインデックスについて、それが参照するすべての列がインデックステーブルに存在する場合、そのローカルインデックスは自動的にインデックステーブルに追加されます。
デフォルトでは、GSI 内の各インデックス列をカバーする既存のインデックスがない場合、その列に対して個別のインデックスが作成されます。
複数のインデックス列を持つ GSI の場合、デフォルトでそれらすべての列をカバーする複合ローカルインデックスが作成されます。
インデックス列の長さパラメーターは、インデックステーブルのシャードキーにローカルインデックスを作成する場合にのみ適用されます。
既存のテーブルに GSI を作成すると、作成プロセスの最後に PolarDB が自動的にデータ整合性を検証します。DDL ステートメントは、データが検証に合格した後にのみ成功します。
GSI データを手動で検証または変更するには、CHECK GLOBAL INDEX ステートメントを使用します。
ALTER TABLE の制約
列操作
次の表は、GSI を持つテーブルでサポートされている ALTER TABLE の列操作を示しています。
| ステートメント | プライマリテーブルのシャードキー | プライマリテーブルのプライマリキー (インデックステーブルのプライマリキーでもある) | ローカル一意インデックス列 | インデックステーブルのシャードキー | 一意インデックス列 | インデックス列 | カバーリング列 |
|---|---|---|---|---|---|---|---|
| ADD COLUMN | 該当シナリオなし | 非対応 | 該当シナリオなし | 該当シナリオなし | 該当シナリオなし | 該当シナリオなし | 該当シナリオなし |
| ALTER COLUMN SET DEFAULT / ALTER COLUMN DROP DEFAULT | 非対応 | 非対応 | 対応 | 非対応 | 非対応 | 非対応 | 非対応 |
| CHANGE COLUMN | 非対応 | 非対応 | 対応 | 非対応 | 非対応 | 非対応 | 非対応 |
| DROP COLUMN | 非対応 | 非対応 | 対応 (一意キーが 1 つの列のみで構成されている場合) | 非対応 | 非対応 | 非対応 | 非対応 |
| MODIFY COLUMN | 非対応 | 非対応 | 対応 | 非対応 | 非対応 | 非対応 | 非対応 |
列の分類は重複する可能性があります。たとえば、インデックス列にはインデックステーブルのシャードキーが含まれ、カバーリング列にはプライマリテーブルのシャードキー、プライマリキー、および明示的に指定された列が含まれます。ある列が「非対応」と「対応」の両方のカテゴリに該当する場合、「非対応」が優先されます。
GSI から列を削除するには、DROP INDEX ステートメントを使用して GSI を削除し、不要な列を含まない状態で再作成します。列を直接 DROP COLUMN で削除することはサポートされていません。これは、GSI の安定性とパフォーマンスを保護するためです。
インデックス操作
次の表は、サポートされている ALTER TABLE のインデックス操作を示しています。
| ステートメント | 対応状況 |
|---|---|
| ALTER TABLE ADD PRIMARY KEY | はい |
| ALTER TABLE ADD [UNIQUE | FULLTEXT | SPATIAL | FOREIGN] KEY | 対応。ローカルインデックスはプライマリテーブルとインデックステーブルに同時に追加できます。インデックス名は GSI 名とは異なる名前にする必要があります。 |
| ALTER TABLE ALTER INDEX *index_name* {VISIBLE | INVISIBLE} | 対応、ただしプライマリテーブルのみ。GSI の可視性ステータスは変更できません。 |
| ALTER TABLE {DISABLE | ENABLE} KEYS | 対応、ただしプライマリテーブルのみ。GSI のステータスは変更できません。 |
| ALTER TABLE DROP PRIMARY KEY | いいえ |
| ALTER TABLE DROP INDEX | 共通インデックスと GSI のみ対応。 |
| ALTER TABLE RENAME INDEX | 非対応。GSI の名前を変更するには、DROP INDEX で GSI を削除し、新しい名前で再作成します。 |
インデックステーブルの制約
DDL および DML ステートメントはインデックステーブルでは実行できません。
NODE HINT を含む DML ステートメントは、プライマリテーブルまたはインデックステーブルの更新には使用できません。
その他の DDL ステートメントの制約
| ステートメント | 対応状況 |
|---|---|
| DROP TABLE | はい |
| DROP INDEX | はい |
| TRUNCATE TABLE | 非対応。プライマリテーブルとそのインデックステーブルの両方からデータを消去し、整合性を維持するには、代わりに DELETE ステートメントを使用します。 |
| RENAME TABLE | 非対応。GSI を持つテーブルの名前を変更するには、DROP INDEX で GSI を削除し、テーブル名を変更してから GSI を再作成します。 |
| ALTER TABLE RENAME | 非対応。上記の RENAME TABLE と同じ回避策を使用します。 |
DML ステートメントの制約
DML ステートメントはインデックステーブルでは実行できません。プライマリテーブルに対する DML 操作の制約については、「DML に対するグローバルセカンダリインデックスの制限」をご参照ください。