All Products
Search
Document Center

PolarDB:Global secondary indexes (GSIs)

Last Updated:Mar 28, 2026

Pada tabel terdistribusi PolarDB-X, kueri yang tidak menyertakan kunci partisi memicu pemindaian penuh di seluruh node data. Hal ini menurunkan performa hingga batas maksimum node tunggal dan menghilangkan skalabilitas linear. Global secondary index (GSI) menghindari pemindaian partisi penuh dengan memungkinkan Anda menentukan skema partisi independen untuk indeks—sehingga kolom apa pun dapat menjadi jalur kueri yang efisien.

Cara kerja GSIs

PolarDB-X menyimpan data tabel di beberapa node data, dipartisi berdasarkan kunci tertentu. Kueri yang menyertakan kunci partisi langsung diarahkan ke partisi yang relevan, sedangkan kueri yang tidak menyertakannya disebar ke setiap partisi.

Jika sistem memiliki N node data, kueri berbasis kunci partisi memberikan beban rata-rata sebesar 1/N pada setiap node. Sebaliknya, pemindaian partisi penuh memberikan beban sebesar 1 pada setiap node—sehingga batas performa turun ke tingkat node tunggal dan sistem kehilangan skalabilitas linear.

GSI mengatasi hal ini dengan bertindak sebagai tabel terpartisi khusus yang menduplikasi kolom tertentu dari tabel utama. Tabel ini dipartisi secara horizontal berdasarkan kunci yang ditentukan pengguna, yang berbeda dari kunci partisi tabel utama. Ketika kueri sesuai dengan kunci partisi GSI, PolarDB-X mengarahkannya ke partisi GSI yang relevan, mengambil baris yang cocok, lalu mengambil kolom tambahan apa pun dari tabel utama. Pendekatan ini menghindari pemindaian partisi penuh.

GSI architecture diagram

PolarDB-X menggunakan transaksi terdistribusi untuk menjaga konsistensi data kuat antara tabel utama dan GSIs-nya.

GSI juga mendukung:

  • Online DDL — membuat, memodifikasi, dan menghapus GSI tanpa mengunci tabel

  • Custom covering columns — menyimpan kolom tambahan dalam GSI untuk mengurangi atau menghilangkan lookup ke tabel utama

  • Invisible indexes — menguji dampak GSI terhadap rencana kueri tanpa mengeksposnya ke pengoptimal kueri, sehingga Anda dapat memvalidasi performa indeks sebelum mengaktifkannya di lingkungan produksi

Jenis GSI

GSI

GSI standar mempartisi data indeks berdasarkan kolom selain kunci partisi tabel utama. Ketika kueri sesuai dengan kunci partisi GSI, PolarDB-X mengarahkan kueri ke partisi yang relevan dan melakukan lookup ke tabel utama untuk kolom tambahan yang diperlukan.

Example: Tabel user dipartisi berdasarkan user_id. Untuk mendukung kueri efisien berdasarkan name, buat GSI pada name.

CREATE TABLE user(
  user_id bigint,
  name varchar(10),
  addr varchar(30),
  GLOBAL INDEX `g_i_name` (name) PARTITION BY HASH(name),
  PRIMARY KEY(user_id)
) PARTITION BY KEY(user_id);

Dengan adanya g_i_name, kueri yang difilter berdasarkan name diarahkan ke partisi yang sesuai pada indeks, bukan memindai semua partisi user.

UGSI

Unique global secondary index (UGSI) memiliki semua properti GSI standar dan juga menerapkan kendala UNIQUE global di seluruh tabel terdistribusi.

Contoh: Tabel user2 dipartisi berdasarkan user_id. Untuk menjamin bahwa phone bersifat unik secara global di semua partisi, buat UGSI pada phone.

CREATE TABLE user2(
  user_id bigint,
  phone varchar(20),
  addr varchar(30),
  UNIQUE GLOBAL INDEX `g_i_phone`(phone) PARTITION BY HASH(phone),
  PRIMARY KEY(user_id)
) PARTITION BY KEY(user_id);

Clustered GSI

Secara default, clustered GSI menyimpan semua kolom dari tabel utama—bukan hanya kunci indeks dan kolom covering. Karena semua kolom tersedia di indeks, kueri tidak perlu lagi melakukan lookup ke tabel utama, sehingga overhead lookup sepenuhnya dihilangkan.

Imbalannya: clustered GSI menempati ruang disk yang sama dengan tabel utama.

Contoh: Tabel order_tbl dipartisi berdasarkan order_id. Untuk mendukung kueri cepat berdasarkan user_id tanpa lookup ke tabel utama, buat clustered GSI pada user_id.

CREATE TABLE order_tbl(
  order_id bigint,
  user_id bigint,
  addr varchar(30),
  info text,
  create_time datetime,
  CLUSTERED INDEX `cg_i_user`(user_id) PARTITION BY HASH(user_id),
  PRIMARY KEY(order_id)
) PARTITION BY KEY(order_id);

Saat melakukan kueri berdasarkan user_id, PolarDB-X mengarahkan kueri ke partisi yang sesuai pada cg_i_user dan membaca semua data yang diperlukan langsung dari indeks.

Kapan menggunakan masing-masing jenis

SkenarioJenis yang direkomendasikan
Kueri berdasarkan kolom non-partisi; lookup ke tabel utama dapat diterimaGSI
Kueri berdasarkan kolom non-partisi; kolom harus unik secara globalUGSI
Kueri berdasarkan kolom non-partisi; prioritas utama adalah menghilangkan overhead lookupClustered GSI

Performa

GSI meningkatkan performa baca tetapi menurunkan performa tulis. Benchmark Sysbench berikut menggambarkan dampaknya pada skala besar.

Performa baca

TabelThreadsselect_random_ranges QPSRata-rata latensi (ms)Persentil ke-95 (ms)select_random_points QPSRata-rata latensi (ms)Persentil ke-95 (ms)
Tabel partisi1282.769,1746,2199,335.226,9924,4842,61
2563.415,64144,97144,975.476,7646,7382,96
5123.272,46156,31257,955.290,6796,72179,94
1.0242.453,16416,12539,715.165,31198,07404,61
Tabel partisi + GSI1289.662,1113,2425,2822.584,895,669,73
25610.431,7324,5251,0225.558,2610,0117,95
51215.634,5132,7273,1327.116,5618,8639,65
1.02422.948,7644,53108,6832.509,8731,4373,13

Dengan GSI pada kolom indeks:

  • QPS kueri rentang: 3.415,64 → 22.948,76 — 571% improvement

  • QPS kueri titik: 5.476,76 → 32.509,87 — 493% improvement

Performa tulis

TabelThreadsWrite-only QPSRata-rata latensi (ms)Persentil ke-95 (ms)Read-write QPSRata-rata latensi (ms)Persentil ke-95 (ms)
Tabel partisi12886.548,128,8710,27113.655,2822,5226,2
256115.774,7113,2619,29149.677,5234,1944,17
512143.928,9420,5134,9514.555,1670,28112,67
1.024153.501,739,5370,55132.150,69131,58287,38
Tabel partisi + GSI12852.069,2214,2518,2890.074,5928,4133,72
25666.250,7923,1732,53114.420,3244,7357,87
51275.700,7439,159,99111.093,6192,09142,39
1.02476.557,9480,14134,9101.828,32182,51350,33

Dengan GSI pada kolom indeks:

  • QPS write-only: 153.501,7 → 76.557,94 — 50% reduction

  • QPS read-write campuran: 149.677,52 → 114.420,32 — 23% reduction

Langkah selanjutnya