全部产品
Search
文档中心

PolarDB:Buat dan gunakan GSI

更新时间:Jul 06, 2025

Topik ini menjelaskan cara membuat dan menggunakan indeks sekunder global (GSI) untuk tabel dalam mode DRDS.

Catatan

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.

Catatan
  • 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 Length dapat 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.

    Catatan

    Anda 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*

Catatan
  • 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

DROP TABLE

Ya

DROP INDEX

Ya

TRUNCATE TABLE

Ya

RENAME TABLE

Ya

ALTER TABLE RENAME

Ya

Contoh

  1. 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 3
  2. Gunakan 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

        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 = 123
        Catatan

        Jika 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` = ?)")          
      Catatan
      • Tabel dasar dalam query SQL di atas adalah t_order, dengan kondisi filter kesetaraan pada seller_id, dan kolom yang terlibat (id, order_snapshot, dan seller_id) dicakup oleh g_i_seller. Memilih indeks penutup g_i_seller baik menghindari pencarian tabel maupun jelas mengurangi jumlah partisi tabel yang harus dipindai (seller_id adalah kunci shard dari g_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';

FAQ

Mengapa pesan kesalahan "Does not support create Global Secondary Index on single or broadcast table" ditampilkan saat saya membuat GSI?

Saat pesan kesalahan ini ditampilkan, periksa apakah tabel data yang Anda operasikan adalah tabel non-partisi atau tabel siaran. GSI tidak dapat dibuat pada tabel non-partisi atau tabel siaran.

Tabel non-partisi dan tabel siaran:

  • Tabel non-partisi:

    • Mode DRDS: Tabel non-partisi dibuat dalam satu database tanpa sharding apa pun.

    • Mode AUTO: Tabel non-partisi dibuat dengan kata kunci SINGLE tanpa partisi apa pun.

  • Tabel siaran (mode DRDS) atau tabel siaran (mode AUTO) merujuk pada tabel yang dibuat dengan kata kunci BROADCAST (tabel ini memiliki salinan identik data pada setiap node data).