STR_HASH adalah fungsi partisi untuk PolarDB-X 1.0 yang mengarahkan data berbasis kunci string ke satu shard database atau tabel tertentu. Fungsi ini mengekstraksi substring dari nilai kunci partisi—berdasarkan posisi atau panjang—lalu menggunakan substring tersebut untuk menghitung shard tujuan.
STR_HASH hanya mendukung query titik. Query rentang pada kunci partisi tidak dapat diarahkan ke satu shard dan akan memicu pemindaian tabel penuh, sehingga menyebabkan waktu respons yang lambat.
Batasan
Kolom kunci partisi harus bertipe
CHARatauVARCHAR.Parameter STR_HASH tidak dapat diubah setelah tabel dibuat.
Instans PolarDB-X 1.0 harus menggunakan versi 5.3.5 atau lebih baru.
Sintaksis
STR_HASH( shardKey [, startIndex, endIndex [, valType [, randSeed ] ] ] )Parameter
| Parameter | Deskripsi | Default |
|---|---|---|
shardKey | Nama kolom kunci partisi. | — |
startIndex | Posisi awal substring (berbasis 0). Atur ke -1 untuk menggunakan endIndex karakter terakhir. | -1 |
endIndex | Posisi akhir substring (berbasis 0, eksklusif). Atur ke -1 untuk menggunakan startIndex karakter pertama. | -1 |
valType | Cara substring ditafsirkan untuk routing: 0 = hash string, 1 = integer. | 0 |
randSeed | Seed acak untuk hash string ketika valType=0. Ubah nilai ini hanya jika distribusi data tidak merata. Nilai default adalah 31; nilai valid lainnya meliputi 131, 13131, dan 1313131. | 31 |
Aturan ekstraksi substring
Parameter startIndex dan endIndex mengontrol bagian mana dari nilai kunci partisi yang digunakan untuk routing.
| Kondisi | Substring yang diekstraksi |
|---|---|
startIndex=j, endIndex=k (j≥0, k≥0, k>j) | Karakter dalam rentang [j, k) dari string asli |
startIndex=-1, endIndex=k (k≥0) | k karakter terakhir. Jika panjang string kurang dari k, seluruh string digunakan. |
startIndex=k, endIndex=-1 (k≥0) | k karakter pertama. Jika panjang string kurang dari k, seluruh string digunakan. |
startIndex=-1, endIndex=-1 | Tanpa pemotongan — seluruh string digunakan. |
Contoh menggunakan ABCDEFG:
| Ekspresi | Hasil |
|---|---|
[1, 5) | BCDE |
[2, 2) | '' (kosong) |
[4, 100) | EFG |
[100, 105) | '' (kosong) |
Nilai valType
0(default): PolarDB-X 1.0 memperlakukan substring sebagai string dan menerapkan fungsi hash untuk menghitung shard.1: PolarDB-X 1.0 memperlakukan substring sebagai integer untuk menghitung shard. Nilai integer tersebut tidak boleh melebihi9223372036854775807dan tidak boleh berupa bilangan titik mengambang.
randSeed hanya berlaku ketika valType=0. Jika Anda mengubah randSeed setelah membuat tabel, ekspor semua data dan impor ulang menggunakan algoritma partisi baru agar data didistribusikan kembali secara benar.
Kasus penggunaan
STR_HASH dirancang untuk skenario di mana kolom string (seperti ID pesanan atau ID pengguna) menjadi kunci partisi dan pola akses didominasi oleh query titik—misalnya, mencari transaksi atau pesanan logistik berdasarkan ID.
Kapan STR_HASH mencapai routing tepat:
Fungsi HASH default menghitung hash dari seluruh nilai string, yang dapat memetakan beberapa nilai berbeda ke shard yang sama. STR_HASH memungkinkan Anda mengekstraksi substring numerik yang diketahui (misalnya tiga digit terakhir dari ID pesanan) dan memperlakukannya sebagai integer, sehingga menjamin bahwa setiap nilai substring yang berbeda dipetakan ke tepat satu shard.
Contoh skenario: Aplikasi keuangan internet mempartisi data ke shard database berdasarkan tahun dan bulan menggunakan YYYYMM, lalu mempartisi ke shard tabel berdasarkan ID pesanan. Tiga karakter terakhir dari setiap ID pesanan merupakan integer dalam rentang 000–999. Persyaratannya adalah setiap akhiran tiga digit yang berbeda harus diarahkan ke tepat satu shard tabel fisik.
-- Routing: int(order_id[-3:]) % 1024 → satu shard tabel fisik per nilai akhiran
CREATE TABLE test_str_hash_tb (
id INT NOT NULL AUTO_INCREMENT,
order_id VARCHAR(30) NOT NULL,
create_time DATETIME DEFAULT NULL,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
DBPARTITION BY YYYYMM(`create_time`)
TBPARTITION BY STR_HASH(`order_id`, -1, 3, 1) TBPARTITIONS 1024;Dengan 1.024 shard tabel dan 1.000 nilai akhiran berbeda (000–999), setiap akhiran diarahkan ke tepat satu shard. Fungsi HASH default tidak dapat menjamin hal ini karena hash-nya dapat memetakan beberapa nilai string ke integer yang sama, sehingga satu shard melayani beberapa nilai akhiran.
Contoh
Contoh berikut menggunakan tabel dengan order_id VARCHAR(32) sebagai kunci partisi, dipartisi ke empat shard database dan delapan shard tabel (empat database, masing-masing dua tabel).
Gunakan empat karakter terakhir sebagai integer untuk routing:
-- Routing: int(order_id[-4:]) % 4 → shard database; % 2 → shard tabel
CREATE TABLE test_str_hash_tb (
id INT NOT NULL AUTO_INCREMENT,
order_id VARCHAR(32) NOT NULL,
create_time DATETIME DEFAULT NULL,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
DBPARTITION BY STR_HASH(`order_id`, -1, 4, 1)
TBPARTITION BY STR_HASH(`order_id`, -1, 4, 1) TBPARTITIONS 2;Gunakan karakter pada posisi 2–6 (karakter ketiga hingga ketujuh) sebagai string untuk routing:
-- Routing: hash(order_id[2:7]) % 4 → shard database; % 2 → shard tabel
CREATE TABLE test_str_hash_tb (
id INT NOT NULL AUTO_INCREMENT,
order_id VARCHAR(32) NOT NULL,
create_time DATETIME DEFAULT NULL,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
DBPARTITION BY STR_HASH(`order_id`, 2, 7)
TBPARTITION BY STR_HASH(`order_id`, 2, 7) TBPARTITIONS 2;Gunakan lima karakter pertama sebagai string untuk routing:
-- Routing: hash(order_id[:5]) % 4 → shard database; % 2 → shard tabel
CREATE TABLE test_str_hash_tb (
id INT NOT NULL AUTO_INCREMENT,
order_id VARCHAR(32) NOT NULL,
create_time DATETIME DEFAULT NULL,
PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
DBPARTITION BY STR_HASH(`order_id`, 5, -1)
TBPARTITION BY STR_HASH(`order_id`, 5, -1) TBPARTITIONS 2;FAQ
Apa perbedaan antara STR_HASH(order_id) dan HASH(order_id)?
Kedua fungsi menggunakan kolom string sebagai kunci partisi dan menghitung hash untuk menentukan shard tujuan. Perbedaan utamanya adalah:
STR_HASH memungkinkan Anda mengekstraksi substring sebelum melakukan hashing, sehingga Anda dapat menargetkan segmen tertentu dari nilai kunci (misalnya empat digit terakhir dari ID pesanan).
STR_HASH menggunakan algoritma UNI_HASH untuk routing berbasis string. HASH melakukan operasi modulo yang lebih sederhana pada hash string lengkap.
Ketika
valType=1, STR_HASH memperlakukan substring sebagai integer dan melakukan routing secara deterministik—setiap integer berbeda dipetakan ke tepat satu shard. HASH tidak memberikan jaminan ini.
Gunakan STR_HASH ketika Anda memerlukan routing satu-ke-satu yang tepat antara nilai substring tertentu dan sebuah shard. Gunakan HASH untuk partisi string tujuan umum ketika ekstraksi substring tidak diperlukan.