Global secondary indexes (GSIs) memiliki batasan tertentu terkait cara pembuatannya, modifikasi tabel yang memuatnya, serta pelaksanaan operasi DDL dan DML. Memahami batasan ini sejak awal membantu Anda menghindari kesalahan desain skema dan kegagalan tak terduga pada waktu proses.
Batasan pembuatan GSI
GSI tidak didukung pada ApsaraDB RDS for MySQL 5.6.
GSI tidak dapat dibuat pada tabel tunggal atau broadcast tables.
GSI tidak dapat dibuat pada tabel yang tidak memiliki primary key.
Prefix indexes tidak dapat digunakan dalam UNIQUE GSI.
Tentukan nama indeks saat membuat tabel indeks.
Saat membuat tabel indeks, tentukan hanya aturan sharding database, atau aturan sharding database dan tabel sekaligus. Menentukan hanya aturan sharding tabel, atau tidak menentukan aturan sharding sama sekali, tidak diperbolehkan.
Kolom INDEX pada tabel indeks harus mencakup semua shard key.
Nama GSI tidak boleh menduplikasi nama indeks lokal apa pun di tabel utama.
Kolom indeks dan covering columns harus berbeda dalam definisi GSI.
Secara default, tabel indeks mencakup semua primary key dan shard key dari tabel utama. Primary key atau shard key yang tidak secara eksplisit dicantumkan sebagai kolom indeks akan secara otomatis ditambahkan ke covering columns.
Untuk setiap indeks lokal di tabel utama, jika semua kolom yang dirujuknya ada di tabel indeks, indeks lokal tersebut akan secara otomatis ditambahkan ke tabel indeks.
Secara default, indeks terpisah dibuat untuk setiap kolom indeks dalam GSI bila tidak ada indeks yang sudah ada yang mencakupnya.
Untuk GSI dengan multiple kolom indeks, indeks lokal komposit yang mencakup semua kolom tersebut dibuat secara default.
Parameter length pada kolom indeks hanya berlaku saat membuat indeks lokal pada shard key tabel indeks.
Saat Anda membuat GSI pada tabel yang sudah ada, PolarDB secara otomatis memverifikasi konsistensi data di akhir proses pembuatan. Pernyataan DDL hanya berhasil setelah data lolos verifikasi.
Untuk memverifikasi atau memodifikasi data GSI secara manual, gunakan pernyataan CHECK GLOBAL INDEX.
Batasan ALTER TABLE
Operasi kolom
Tabel berikut menunjukkan operasi kolom ALTER TABLE yang didukung pada tabel yang memiliki GSI.
| Statement | Shard keys tabel utama | Kunci utama tabel utama (juga kunci utama tabel indeks) | Kolom Indeks Unik Lokal | Shard keys tabel indeks | Kolom Indeks Unik | Kolom indeks | Covering column |
|---|---|---|---|---|---|---|---|
| ADD COLUMN | Tidak ada skenario seperti ini | Tidak didukung | Tidak ada skenario seperti ini | Tidak ada skenario seperti ini | Tidak ada skenario seperti ini | Tidak ada skenario seperti ini | Tidak ada skenario seperti ini |
| ALTER COLUMN SET DEFAULT / ALTER COLUMN DROP DEFAULT | Tidak didukung | Tidak didukung | Didukung | Tidak didukung | Tidak didukung | Tidak didukung | Tidak didukung |
| CHANGE COLUMN | Tidak didukung | Tidak didukung | Didukung | Tidak didukung | Tidak didukung | Tidak didukung | Tidak didukung |
| DROP COLUMN | Tidak didukung | Tidak didukung | Didukung (hanya ketika unique key memiliki tepat satu kolom) | Tidak didukung | Tidak didukung | Tidak didukung | Tidak didukung |
| MODIFY COLUMN | Tidak didukung | Tidak didukung | Didukung | Tidak didukung | Tidak didukung | Tidak didukung | Tidak didukung |
Klasifikasi kolom dapat tumpang tindih. Misalnya, kolom indeks mencakup shard keys tabel indeks, dan covering column mencakup shard keys tabel utama, primary keys, serta kolom yang secara eksplisit ditentukan. Jika suatu kolom termasuk dalam kategori "Tidak didukung" dan "Didukung" sekaligus, maka kategori "Tidak didukung" yang berlaku.
Untuk menghapus kolom dari GSI, gunakan pernyataan DROP INDEX untuk menghapus GSI, lalu buat ulang tanpa kolom yang tidak diinginkan. Menghapus kolom secara langsung dengan DROP COLUMN tidak didukung demi menjaga stabilitas dan performa GSI.
Operasi indeks
Tabel berikut menunjukkan operasi indeks ALTER TABLE yang didukung.
| Statement | Didukung |
|---|---|
| ALTER TABLE ADD PRIMARY KEY | Ya |
| ALTER TABLE ADD [UNIQUE | FULLTEXT | SPATIAL | FOREIGN] KEY | Ya. Indeks lokal dapat ditambahkan ke tabel utama dan tabel indeks sekaligus. Nama indeks harus berbeda dari nama GSI. |
| ALTER TABLE ALTER INDEX *index_name* {VISIBLE | INVISIBLE} | Ya, hanya pada tabel utama. Status visibilitas GSI tidak dapat diubah. |
| ALTER TABLE {DISABLE | ENABLE} KEYS | Ya, hanya pada tabel utama. Status GSI tidak dapat diubah. |
| ALTER TABLE DROP PRIMARY KEY | Tidak |
| ALTER TABLE DROP INDEX | Didukung hanya untuk indeks umum dan GSI. |
| ALTER TABLE RENAME INDEX | Tidak. Untuk mengganti nama GSI, hapus dengan DROP INDEX, lalu buat ulang dengan nama baru. |
Batasan tabel indeks
Pernyataan DDL dan DML tidak dapat dieksekusi pada tabel indeks.
Pernyataan DML yang mencakup NODE HINT tidak dapat digunakan untuk memperbarui tabel utama atau tabel indeks.
Batasan pernyataan DDL lainnya
| Statement | Didukung |
|---|---|
| DROP TABLE | Ya |
| DROP INDEX | Ya |
| TRUNCATE TABLE | Tidak. Untuk menghapus data dari tabel utama dan tabel indeksnya sekaligus sambil menjaga konsistensi, gunakan pernyataan DELETE sebagai gantinya. |
| RENAME TABLE | Tidak. Untuk mengganti nama tabel yang memiliki GSI, hapus GSI dengan DROP INDEX, ganti nama tabel, lalu buat ulang GSI. |
| ALTER TABLE RENAME | Tidak. Gunakan solusi alternatif yang sama seperti RENAME TABLE di atas. |
Batasan pernyataan DML
Pernyataan DML tidak dapat dieksekusi pada tabel indeks. Untuk batasan operasi DML terhadap tabel utama, lihat Batasan global secondary indexes pada DML.