Indeks standar pada tabel partisi bersifat lokal—hanya mencakup data dalam satu partisi. Artinya, kueri yang tidak memfilter berdasarkan kunci partisi harus memindai setiap partisi, hasilnya tidak diurutkan secara global, dan batasan unik harus mencakup semua kunci partisi. Global secondary indexes (GSIs) mengatasi keterbatasan ini dengan mencakup semua partisi, sehingga Anda dapat melakukan kueri pada kolom apa pun secara efisien dan menerapkan keunikan tanpa menyertakan kunci partisi.
Untuk menggunakan fitur ini, buka Quota Center. Temukan kuota berdasarkan Quota ID-nya polardb_mysql_gsi, lalu klik Apply di kolom Actions.
Mengapa indeks lokal tidak memadai
Indeks lokal dipartisi dengan cara yang sama seperti tabelnya. Setiap partisi indeks hanya mencakup partisi tabel yang sesuai, sehingga data diurutkan dalam setiap partisi tetapi tidak di seluruh partisi. Hal ini menimbulkan tiga masalah ketika kueri tidak menyertakan kunci partisi:
-
Pemindaian penuh semua partisi: Setiap partisi dipindai, menyebabkan amplifikasi baca yang meningkat seiring bertambahnya jumlah partisi.
-
Tidak ada jaminan urutan global: Hasil dari partisi yang diurutkan tidak diurutkan secara global, yang dapat memicu langkah pengurutan tambahan.
-
Batasan indeks unik: Indeks unik lokal harus mencakup semua kunci partisi untuk menegakkan keunikan di seluruh partisi.
GSI tidak dipartisi. GSI dibangun dari data di seluruh partisi dan diurutkan secara global. Indeks unik global pada GSI tidak perlu mencakup semua kunci partisi.
Kapan menggunakan GSI
|
Skenario |
Jenis indeks yang direkomendasikan |
Alasan |
|
Kueri yang sering memfilter berdasarkan kolom non-kunci-partisi |
GSI |
Menghindari pemindaian penuh semua partisi |
|
Batasan keunikan global pada kolom non-kunci-partisi |
GSI |
Indeks unik lokal memerlukan semua kunci partisi |
|
Pengarsipan partisi yang jarang dilakukan (misalnya, partisi bulanan yang disimpan selama bertahun-tahun) |
GSI |
Kinerja kueri lebih baik, pergantian partisi lebih sedikit |
|
Kueri sebagian besar terbatas pada satu partisi |
Indeks lokal |
Overhead penulisan lebih rendah |
Versi yang didukung
Fitur ini memerlukan kluster PolarDB for MySQL yang menjalankan versi 8.0.2, revisi 8.0.2.2.7 atau lebih baru. Untuk informasi tentang cara memeriksa versi kluster Anda, lihat Kueri nomor versi.
Batasan
-
GSI hanya didukung pada tabel partisi InnoDB. Tabel partisi hibrid tidak didukung.
-
GSI tidak dapat berupa indeks teks penuh atau indeks spasial.
-
GSI tidak didukung pada tabel terkompresi, tabel temporary, atau tabel terenkripsi. Tabel yang menggunakan format baris REDUNDANT atau COMPRESSED juga tidak didukung.
-
Tabel dengan GSI tidak mendukung kolom yang dihasilkan (generated columns).
-
Operasi DDL tingkat partisi—kecuali menambah, menghapus partisi RANGE atau LIST, dan memotong (truncate) partisi—membuat GSI yang ada tidak valid. Anda harus menghapus dan membangun ulang semua GSI pada tabel tersebut, atau gunakan sintaksis
UPDATE GLOBAL INDEXuntuk membangun ulang GSI dalam pernyataan yang sama.CatatanMenghapus partisi RANGE atau LIST dan memotong partisi tanpa membuat GSI tidak valid adalah fitur terbatas. Anda harus mengajukan permohonan akses sebelum dapat menggunakannya. Untuk informasi lebih lanjut, lihat Peningkatan fitur.
Peningkatan fitur
-
Buat GSI lebih cepat menggunakan DDL paralel.
-
Gunakan Penambahan kolom instan pada tabel partisi yang memiliki GSI.
-
Untuk tabel partisi RANGE atau LIST yang memiliki GSI, kunci metadata (MDLs) tingkat partisi didukung saat menambahkan partisi baru.
-
Konversi tabel yang memiliki GSI menjadi tabel partisi INTERVAL RANGE, atau buat GSI langsung pada tabel partisi INTERVAL RANGE.
-
Saat Anda melakukan operasi DDL tingkat partisi pada tabel partisi yang memiliki GSI, gunakan sintaksis
UPDATE GLOBAL INDEXuntuk membangun ulang GSI dalam pernyataan yang sama. -
Anda dapat menghapus partisi RANGE atau LIST, atau memotong partisi jenis apa pun, tanpa membuat GSI yang ada tidak valid. Ini adalah fitur terbatas. Untuk mengaktifkannya, buka Quota Center dan cari Quota ID
polardb_mysql_gsi_drop_partitionataupolardb_mysql_gsi_truncate_part. Di kolom Actions, klik Apply untuk mengaktifkan fitur tersebut.CatatanFitur ini hanya didukung pada PolarDB for MySQL 8.0.2, revisi 8.0.2.2.31 atau lebih baru.
-
Saat Anda menghapus atau memotong partisi pada tabel yang memiliki GSI, data usang mungkin tetap ada di GSI jika Anda tidak membangun ulang GSI tersebut. Anda dapat mengaktifkan fitur purge asinkron agar thread latar belakang membersihkan data usang tersebut secara otomatis. Ini adalah fitur terbatas. Untuk mengaktifkannya, buka Quota Center dan cari Quota ID
polardb_mysql_gsi_async_purge. Di kolom Actions, klik Apply untuk mengaktifkan fitur tersebut.CatatanFitur ini hanya didukung pada PolarDB for MySQL 8.0.2, revisi 8.0.2.2.35 atau lebih baru.
Sintaksis
Tambahkan kata kunci GLOBAL atau LOCAL setelah nama indeks saat membuat indeks.
Jika Anda menghilangkan kata kunci tersebut, indeks lokal akan dibuat secara default.
-- Buat indeks global
INDEX index_name(column) GLOBAL
-- Buat indeks lokal
INDEX index_name(column) LOCAL
Buat GSI
Buat GSI secara inline dengan tabel
Tambahkan kata kunci GLOBAL saat mendefinisikan indeks dalam CREATE TABLE:
CREATE TABLE t1(
a INT PRIMARY KEY,
b INT,
INDEX k1(b) GLOBAL
) PARTITION BY HASH(a) PARTITIONS 3;
Tambahkan GSI ke tabel yang sudah ada
Gunakan ALTER TABLE untuk menambahkan indeks global, atau CREATE UNIQUE INDEX untuk menambahkan indeks unik global:
-- Buat tabel
CREATE TABLE t1(
a INT PRIMARY KEY,
b INT
) PARTITION BY HASH(a) PARTITIONS 3;
-- Tambahkan indeks global pada kolom b
ALTER TABLE t1 ADD INDEX k1(b) GLOBAL;
-- Tambahkan indeks unik global pada kolom b
CREATE UNIQUE INDEX k2 ON t1(b) GLOBAL;
Bangun ulang GSI selama DDL partisi
Gunakan UPDATE GLOBAL INDEX untuk membangun ulang GSI dalam pernyataan yang sama dengan operasi DDL tingkat partisi. Hal ini menghindari GSI berada dalam keadaan tidak valid.
Contoh berikut membuat tabel partisi RANGE dengan GSI, lalu menghapus partisi dan membangun ulang GSI dalam satu pernyataan:
-- Langkah 1: Buat tabel partisi rentang dengan indeks global
CREATE TABLE t1(
a INT PRIMARY KEY,
b INT,
INDEX k1(b) GLOBAL
) PARTITION BY RANGE (`a`)
(PARTITION p0 VALUES LESS THAN (5) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB);
-- Langkah 2: Hapus partisi p1 dan bangun ulang GSI
ALTER TABLE t1 DROP PARTITION p1 UPDATE GLOBAL INDEX;
Kinerja
GSI memberikan kinerja lebih baik daripada indeks lokal untuk kueri SELECT, UPDATE, dan DELETE yang tidak menyertakan kunci partisi. Keunggulan ini semakin besar seiring bertambahnya jumlah partisi dan volume data.
Pengaturan pengujian: Dua tabel partisi HASH dengan 32 partisi dan masing-masing 1.000.000 baris—satu dengan indeks lokal, satu dengan GSI.
-- Tabel dengan indeks lokal
CREATE TABLE mytest1.big_table_1(
a INT PRIMARY KEY,
b INT,
c INT,
INDEX k1(b) LOCAL
) PARTITION BY HASH(a) PARTITIONS 32;
-- Tabel dengan GSI
CREATE TABLE mytest2.big_table_1(
a INT PRIMARY KEY,
b INT,
c INT,
INDEX k1(b) GLOBAL
) PARTITION BY HASH(a) PARTITIONS 32;
SELECT — waktu eksekusi, kondisi kueri tidak menyertakan kunci partisi:

UPDATE — waktu eksekusi, kondisi kueri tidak menyertakan kunci partisi:

DELETE — waktu eksekusi, kondisi kueri tidak menyertakan kunci partisi:

Keunggulan kinerja GSI semakin terasa seiring bertambahnya volume data dan jumlah partisi.
Langkah selanjutnya
-
DDL paralel — percepat pembuatan GSI pada tabel besar
-
Penambahan kolom instan — tambahkan kolom ke tabel partisi dengan GSI tanpa perlu membangun ulang seluruh tabel
-
Tabel partisi INTERVAL RANGE — manajemen partisi otomatis yang kompatibel dengan GSI