Topik ini menjelaskan cara membuat dan menggunakan indeks sekunder global (GSI) untuk tabel dalam mode DRDS.
Metode dalam topik ini juga berlaku untuk tabel dalam mode AUTO. Namun, Anda harus menggunakan sintaksis yang dijelaskan dalam CREATE INDEX (mode AUTO).
Struktur sintaksis GSI
PolarDB-X memperluas sintaksis DDL MySQL untuk mendukung pembuatan GSI, yang serupa dengan pembuatan indeks di MySQL.
Tentukan GSI saat membuat tabel.
Tambahkan GSI setelah membuat tabel.
Nama indeks: Nama dari GSI.
Nama tabel dasar: Tabel induk dari GSI.
Kolom indeks: Kunci shard dari GSI, mencakup semua kolom yang digunakan dalam klausa sharding indeks.
Kolom penutup: Kolom lain dalam GSI. Secara default, mencakup kunci utama dan semua kunci shard dari tabel dasar.
Klausa sharding: Algoritma sharding database dan tabel dari GSI. Sintaksisnya konsisten dengan klausa sharding dalam pernyataan
CREATE TABLE.Variabel sebelumnya adalah untuk membuat GSI dalam tabel dalam mode DRDS. Untuk informasi lebih lanjut tentang membuat GSI dalam tabel dalam mode AUTO, lihat CREATE TABLE (mode AUTO).
Kendala
Kendala pada pembuatan GSI
Anda tidak dapat membuat indeks sekunder global untuk tabel non-partisi atau tabel siaran.
Indeks sekunder global unik tidak mendukung indeks awalan.
Saat membuat tabel indeks, Anda harus menentukan nama untuk indeks tersebut.
Saat membuat tabel indeks, Anda harus menentukan aturan sharding database atau aturan untuk sharding database dan tabel. Perhatikan bahwa Anda tidak dapat menentukan hanya aturan sharding tabel.
Kunci indeks dari tabel indeks harus mencakup semua kunci shard dari tabel indeks.
Anda tidak dapat menentukan kolom yang sama sebagai kolom kunci indeks dan kolom penutup.
Secara default, tabel indeks berisi kolom kunci utama dan semua kolom kunci shard dari tabel dasar. Jika Anda tidak menentukan kolom kunci utama dan kunci shard sebagai kolom kunci indeks, kolom-kolom ini secara default digunakan sebagai kolom penutup.
Dalam database mode DRDS, jika semua kolom indeks lokal dalam tabel dasar termasuk dalam tabel indeks, indeks lokal ditambahkan ke tabel indeks secara default.
Jika tidak ada indeks lokal yang dibuat pada kolom kunci indeks dari indeks sekunder global, indeks lokal secara otomatis dibuat pada setiap kolom kunci indeks dari indeks sekunder global.
Secara default, indeks komposit dibuat untuk indeks sekunder global yang dibuat pada beberapa kolom. Indeks komposit berlaku untuk semua kolom kunci indeks dari indeks sekunder global.
Parameter
Lengthdapat digunakan untuk menentukan hanya panjang awalan kunci shard yang ingin Anda gunakan untuk membuat indeks lokal.Saat membuat indeks sekunder global untuk tabel, sistem memverifikasi data setelah indeks sekunder global dibuat. Pernyataan DDL yang digunakan untuk membuat indeks sekunder global hanya dapat dieksekusi setelah data dalam tabel indeks diverifikasi.
CatatanAnda juga dapat menggunakan pernyataan CHECK GLOBAL INDEX untuk memverifikasi dan memperbaiki data dalam tabel indeks.
Kendala pada ALTER TABLE
Klausa | Mengubah kunci shard tabel dasar | Mengubah kunci utama | Mengubah kolom unik indeks lokal | Mengubah kunci shard tabel indeks | Mengubah kolom dalam indeks unik tabel | Mengubah kolom indeks | Mengubah kolom penutup |
ADD COLUMN | N/A | Tidak didukung | N/A | N/A | N/A | N/A | N/A |
ALTER COLUMN SET DEFAULT dan ALTER COLUMN DROP DEFAULT | Didukung | Didukung | Didukung | Didukung | Didukung | Didukung | Didukung |
CHANGE COLUMN | Tidak didukung | Tidak didukung | Didukung | Tidak didukung | Didukung* | Didukung* | Didukung* |
DROP COLUMN | Tidak didukung | Tidak didukung | Hanya didukung jika indeks unik dibuat hanya pada satu kolom | Tidak didukung | Didukung* | Didukung* | Didukung* |
MODIFY COLUMN | Didukung* (hanya dalam mode AUTO) | Didukung* | Didukung | Didukung* (hanya dalam mode AUTO) | Didukung* | Didukung* | Didukung* |
Didukung*: Menunjukkan bahwa hanya instance yang memenuhi syarat untuk mendukung perubahan tipe kolom tanpa kunci yang didukung.
Pernyataan DROP COLUMN tidak dapat digunakan untuk mengganti nama indeks sekunder global. Jika Anda mengganti nama indeks sekunder global, kinerja indeks sekunder global mungkin terpengaruh secara negatif. Jika Anda ingin menghapus kolom dalam indeks sekunder global, Anda dapat menggunakan pernyataan DROP INDEX untuk menghapus indeks sekunder global dan kemudian membuat indeks sekunder global baru. Anda juga dapat hubungi kami untuk dukungan teknis.
Dalam skenario tertentu, kolom yang sama termasuk dalam jenis kolom berbeda yang dijelaskan dalam tabel sebelumnya. Misalnya, kolom kunci shard yang sama dari tabel digunakan sebagai kolom indeks dan kolom penutup. Saat kolom yang sama digunakan sebagai kolom dari jenis berbeda dalam tabel indeks dan operasi tidak didukung oleh salah satu jenis kolom, Anda tidak dapat melakukan operasi pada kolom tersebut.
Tabel berikut menjelaskan pernyataan ALTER TABLE yang dapat Anda gunakan untuk mengelola indeks.
Pernyataan | Deskripsi |
ALTER TABLE ADD PRIMARY KEY | Didukung. |
ALTER TABLE ADD [UNIQUE/FULLTEXT/SPATIAL/FOREIGN] KEY | Didukung. Anda dapat menggunakan pernyataan ini untuk menambahkan indeks lokal pada tabel dasar dan tabel indeks secara bersamaan. Nama indeks lokal tidak boleh sama dengan nama indeks sekunder global. |
ALTER TABLE ALTER INDEX index_name {VISIBLE | INVISIBLE} | Didukung. Anda hanya dapat menggunakan pernyataan ini pada tabel dasar. Anda tidak dapat menggunakan pernyataan ini untuk mengubah status indeks sekunder global. |
ALTER TABLE {DISABLE | ENABLE} KEYS | Didukung. Anda hanya dapat menggunakan pernyataan ini pada tabel dasar. Anda tidak dapat menggunakan pernyataan ini untuk mengubah status indeks sekunder global. |
ALTER TABLE DROP PRIMARY KEY | Tidak didukung. |
ALTER TABLE DROP INDEX | Didukung. Anda dapat menggunakan pernyataan ini untuk menghapus hanya indeks biasa atau indeks sekunder global. |
ALTER TABLE DROP FOREIGN KEY fk_symbol | Didukung. Anda hanya dapat mengeksekusi pernyataan ini pada tabel dasar. |
ALTER TABLE RENAME INDEX | Didukung. |
Kendala pada ALTER GSI TABLE
Pernyataan DDL dan DML tidak dapat dieksekusi pada GSI.
Pernyataan DML dengan NODE HINT tidak dapat memperbarui tabel dasar dan GSI.
Kendala lainnya
Pernyataan | Didukung dalam tabel dengan GSI |
Ya | |
Ya | |
Ya | |
Ya | |
ALTER TABLE RENAME | Ya |
Contoh
Buat GSI.
-- Tentukan GSI saat membuat tabel CREATE TABLE t_order ( `id` BIGINT(11) NOT NULL AUTO_INCREMENT, `order_id` VARCHAR(20) DEFAULT NULL, `buyer_id` VARCHAR(20) DEFAULT NULL, `seller_id` VARCHAR(20) DEFAULT NULL, `order_snapshot` LONGTEXT DEFAULT NULL, `order_detail` LONGTEXT DEFAULT NULL, PRIMARY KEY (`id`), GLOBAL INDEX `g_i_seller`(`seller_id`) COVERING (`id`, `order_id`, `buyer_id`, `order_snapshot`) dbpartition BY hash(`seller_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition BY hash(`order_id`); -- Tambahkan GSI CREATE UNIQUE GLOBAL INDEX `g_i_buyer` ON `t_order`(`buyer_id`) COVERING(`seller_id`, `order_snapshot`) dbpartition BY hash(`buyer_id`) tbpartition BY hash(`buyer_id`) tbpartitions 3Gunakan GSI dalam query.
Tentukan indeks menggunakan hint.
Anda dapat memilih salah satu dari dua pernyataan HINT berikut untuk menentukan indeks target untuk query.
FORCE INDEX({index_name})Contoh:
SELECT a.order_id FROM t_order a FORCE INDEX(g_i_seller) WHERE a.buyer_id = 123;Hint
/*+TDDL:INDEX({table_name/table_alias}, {index_name})*/Contoh:
/*+TDDL:index(a, g_i_buyer)*/ SELECT * FROM t_order a WHERE a.buyer_id = 123CatatanJika query memerlukan penggunaan kolom yang tidak termasuk dalam indeks, GSI pertama kali diquery untuk mendapatkan kunci utama dan kunci shard tabel dasar dari semua rekaman, dan kemudian tabel dasar diquery untuk mendapatkan nilai kolom yang hilang. Untuk informasi lebih lanjut, lihat INDEX HINT.
Contoh pemilihan indeks:
Untuk query pada tabel dasar dengan GSI, PolarDB-X secara otomatis memilih GSI yang dianggap oleh optimizer memiliki biaya terendah (hanya pemilihan indeks penutup yang didukung).
EXPLAIN SELECT t_order.id,t_order.order_snapshot FROM t_order WHERE t_order.seller_id = 's1';Hasil rencana eksekusi:
IndexScan(tables="g_i_seller_sfL1_2", sql="SELECT `id`, `order_snapshot` FROM `g_i_seller` AS `g_i_seller` WHERE (`seller_id` = ?)")CatatanTabel dasar dalam query SQL di atas adalah
t_order, dengan kondisi filter kesetaraan padaseller_id, dan kolom yang terlibat (id,order_snapshot, danseller_id) dicakup olehg_i_seller. Memilih indeks penutupg_i_sellerbaik menghindari pencarian tabel maupun jelas mengurangi jumlah partisi tabel yang harus dipindai (seller_idadalah kunci shard darig_i_seller).Dalam hasil rencana eksekusi, Anda dapat melihat bahwa optimizer PolarDB-X telah memilih
g_i_seller.
IGNORE INDEX
Sintaksis:
IGNORE INDEX({index_name},...)Contoh:
SELECT t_order.id,t_order.order_snapshot FROM t_order IGNORE INDEX(g_i_seller) WHERE t_order.seller_id = 's1';USE INDEX
Sintaksis:
USE INDEX({index_name},...)Contoh:
SELECT t_order.id,t_order.order_snapshot FROM t_order USE INDEX(g_i_seller) WHERE t_order.seller_id = 's1';