全部产品
Search
文档中心

PolarDB:GSIs

更新时间:Jul 03, 2025

Topik ini menjelaskan prinsip, fitur, dan jenis indeks sekunder global (GSIs).

Ikhtisar

GSIs merupakan fitur penting dari PolarDB-X. Berbeda dengan indeks sekunder lokal, data GSIs didistribusikan ke node berdasarkan aturan partisi yang ditentukan. GSIs memungkinkan Anda menanyakan data menggunakan metode selain kunci utama serta menerapkan batasan unik di seluruh dataset.

Prinsip dan fitur

Dalam tabel terpartisi database terdistribusi, data diorganisir dan disimpan berdasarkan kunci partisi yang ditentukan saat pembuatan tabel. Query berdasarkan kunci partisi dapat langsung diarahkan ke partisi relevan. Namun, query tanpa kunci partisi memerlukan pemindaian penuh pada semua partisi. Pada database terdistribusi, pemindaian penuh dapat meningkatkan jumlah query lambat, mengurangi throughput sistem, dan menyebabkan hilangnya kemampuan penskalaan linier. Untuk menjaga performa optimal, kami sarankan menerapkan langkah-langkah untuk mencegah pemindaian semua partisi.

Query yang mencakup kunci partisi diarahkan ke partisi tertentu. Dalam sistem dengan N node data, beban rata-rata query pada satu node adalah 1/N dari total beban query. Jika query tidak mencakup kunci partisi, pemindaian penuh di semua partisi dipicu, sehingga beban rata-rata query tunggal pada setiap node menjadi 1. Batas atas performa node tunggal menentukan batas atas performa database terdistribusi, yang mengakibatkan hilangnya kemampuan penskalaan linier.

PolarDB-X menyediakan fitur GSI untuk mengatasi masalah tersebut. Di dalam PolarDB-X, GSI dapat digunakan sebagai tabel terpartisi khusus yang menduplikasi kolom tertentu dari tabel utama. Mirip dengan tabel terpartisi biasa, GSI dibagi secara horizontal menjadi beberapa partisi berdasarkan aturan partisi yang ditentukan pengguna dan didistribusikan ke node data yang berbeda. Jika query tidak mengandung kunci partisi tabel utama tetapi mengandung kunci partisi GSI, PolarDB-X pertama-tama mengambil data dari partisi relevan GSI sebelum mengakses tabel utama untuk informasi tambahan. Hal ini mencegah pemindaian penuh di semua partisi.

PolarDB-X menggunakan transaksi terdistribusi untuk mempertahankan konsistensi data yang kuat antara tabel utama dan GSI.

GSIs juga mendukung fitur-fitur berikut:

  • Anda dapat memodifikasi, membuat, dan menghapus GSIs tanpa perlu mengunci tabel.

  • Anda dapat menentukan kolom penutup kustom untuk mengurangi overhead operasi pencarian pada tabel utama.

  • Indeks tak terlihat didukung.

Jenis

GSIs

GSI dapat memberikan metode partisi yang berbeda dari tabel utama. Jika kondisi query dari Pernyataan SQL tidak mengandung kunci partisi tabel utama tetapi mengandung kunci partisi GSI, query tidak memindai semua partisi.

Sebagai contoh, jika Anda ingin menanyakan tabel user_tbl berdasarkan kolom user_id dan name, Anda dapat membuat GSI bernama g_i_name. Ini mencegah pemindaian semua partisi ketika Anda menanyakan tabel berdasarkan kolom 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);

UGSIs

Indeks sekunder global unik (UGSI) adalah GSI khusus yang memiliki properti GSI biasa dan mengimplementasikan batasan UNIQUE global.

Sebagai contoh, jika Anda ingin nomor ponsel pengguna bersifat unik secara global di tabel user2, Anda dapat membuat UGSI pada bidang phone sebagai kunci indeks.

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 GSIs

Indeks sekunder global terkluster (clustered GSI) adalah GSI khusus. Secara default, clustered GSI berisi data dari semua kolom tabel utama. Ruang disk yang ditempati oleh clustered GSI sama dengan ruang disk yang ditempati oleh tabel utama. Anda dapat menggunakan clustered GSIs untuk mencegah pemindaian semua partisi dan overhead operasi pencarian.

Sebagai contoh, jika Anda ingin menanyakan tabel order_tbl berdasarkan kolom user_id atau order_id, dan Anda ingin mencegah operasi pencarian pada tabel ketika Anda menanyakan pesanan berdasarkan kolom user_id, Anda dapat membuat clustered GSI bernama cg_i_user pada kolom user_id sebagai kunci indeks. Ketika Anda menanyakan pesanan berdasarkan kolom user_id, PolarDB-X mengarahkan query ke partisi spesifik cg_i_user. Karena cg_i_user berisi semua data tabel utama, PolarDB-X tidak perlu mencari tabel utama.

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);

Kinerja

Pengaruh GSIs pada kinerja baca dan tulis bervariasi berdasarkan skenario bisnis. Dalam kebanyakan kasus, GSIs menurunkan kinerja tulis dan secara signifikan meningkatkan kinerja baca. Dalam contoh-contoh berikut, skenario Sysbench digunakan untuk menunjukkan dampak GSIs pada throughput baca dan tulis.

Kinerja baca

Tabel

Threads

Skenario Sysbench seIect_random_ranges

Skenario Sysbench seIect_random_points

QPS

Latensi rata-rata

Latensi 95%

QPS

Latensi rata-rata

Latensi 95%

Tabel terpartisi

128

2.769,17

46,21

99,33

5.226,99

24,48

42,61

256

3.415,64

144,97

144,97

5.476,76

46,73

82,96

512

3.272,46

156,31

257,95

5.290,67

96,72

179,94

1.024

2.453,16

416,12

539,71

5.165,31

198,07

404,61

Tabel terpartisi + GSI

128

9.662,11

13,24

25,28

22.584,89

5,66

9,73

256

10.431,73

24,52

51,02

25.558,26

10,01

17,95

512

15.634,51

32,72

73,13

27.116,56

18,86

39,65

1.024

22.948,76

44,53

108,68

32.509,87

31,43

73,13

Setelah GSI dibuat:

  • Dalam query rentang, QPS meningkat dari 3.415,64 menjadi 22.948,76, yang menunjukkan bahwa kinerja query rentang ditingkatkan sebesar 571%.

  • Dalam query titik, QPS meningkat dari 5.476 menjadi 32.509,87, yang menunjukkan bahwa kinerja query titik ditingkatkan sebesar 493%.

Kesimpulan: GSIs dapat meningkatkan kinerja query Sysbench pada kolom indeks.

Kinerja penulisan data

Tabel

Threads

Skenario Sysbench seIect_random_ranges

Skenario Sysbench seIect_random_points

QPS

Latensi rata-rata

Latensi 95%

QPS

Latensi rata-rata

Latensi 95%

Tabel terpartisi

128

86.548,12

8,87

10,27

113.655,28

22,52

26,2

256

115.774,71

13,26

19,29

149.677,52

34,19

44,17

512

143.928,94

20,51

34,95

14.555,16

70,28

112,67

1.024

153.501,7

39,53

70,55

132.150,69

131,58

287,38

Tabel terpartisi + GSI

128

52.069,22

14,25

18,28

90.074,59

28,41

33,72

256

66.250,79

23,17

32,53

114.420,32

44,73

57,87

512

75.700,74

39,1

59,99

111.093,61

92,09

142,39

1.024

76.557,94

80,14

134,9

101.828,32

182,51

350,33

Setelah GSI dibuat:

  • Dalam operasi hanya menulis, QPS menurun dari 153.501,7 menjadi 76.557,94, yang menunjukkan bahwa QPS tulis berkurang sebesar 50%.

  • Dalam operasi baca dan tulis, QPS menurun dari 149.677,52 menjadi 114.420,32, yang menunjukkan bahwa QPS baca dan tulis berkurang sebesar 23%.

Kesimpulan: Pembuatan GSI menurunkan kinerja tulis Sysbench.

Referensi

Buat dan gunakan GSIs

Indeks terkluster