RANGE_HASH adalah fungsi partisi kunci ganda untuk PolarDB-X 1.0, digunakan ketika data di-shard berdasarkan dua kunci bisnis, tetapi hanya satu kunci tersedia saat kueri dilakukan.
Cara kerja
RANGE_HASH(COL1, COL2, N) mengarahkan setiap baris ke sebuah shard dengan mengambil N karakter terakhir dari kunci partisi, lalu menghitung sisa bagi (remainder) dari nilai hash setelah dibagi dengan jumlah shard database.
Referensi parameter
| Parameter | Tipe data | Deskripsi |
|---|---|---|
COL1 | string atau number | Kunci partisi utama. Dipilih terlebih dahulu jika ada dalam kueri. |
COL2 | string atau number | Kunci partisi cadangan. Dipilih ketika COL1 tidak ada dalam kueri. |
N | integer | Jumlah karakter akhir yang digunakan untuk perhitungan hash. Kedua kunci harus memiliki setidaknya N karakter, dan N karakter terakhirnya harus identik untuk setiap baris tertentu. |
Logika pengarahan
Saat menerima kueri, PolarDB-X 1.0 memilih kunci yang tersedia dalam urutan berikut:
| Kueri menyediakan | Kunci yang digunakan untuk pengarahan |
|---|---|
COL1 saja | COL1 — hash dihitung dari N karakter terakhir |
COL2 saja | COL2 — hash dihitung dari N karakter terakhir |
Keduanya: COL1 dan COL2 | COL1 — hash dihitung dari N karakter terakhir |
Dalam semua kasus, nilai hash dibagi dengan jumlah shard dan sisa baginya menentukan shard tujuan.
Batasan
COL1danCOL2harus memiliki tipe data yang sama, yaitu string atau number.Kunci partisi tidak dapat diubah setelah tabel dibuat.
Kueri rentang (range queries) pada kunci partisi tidak didukung.
Saat memasukkan data,
Nkarakter terakhir dariCOL1danCOL2harus identik.Nilai string harus memiliki panjang minimal
Nkarakter.Memerlukan PolarDB-X 1.0 versi 5.1.28-1320920 atau lebih baru.
Contoh
Pernyataan Data Definition Language (DDL) berikut membuat tabel pesanan di kluster PolarDB-X 1.0 dengan delapan shard database fisik. Pesanan di-shard berdasarkan buyer_id dan order_id, meskipun kueri mungkin hanya menyediakan salah satu ID tersebut.
CREATE TABLE test_order_tb (
id INT,
buyer_id VARCHAR(30) DEFAULT NULL,
order_id VARCHAR(30) DEFAULT NULL,
create_time DATETIME DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
dbpartition BY RANGE_HASH(buyer_id, order_id, 10)
tbpartition BY RANGE_HASH(buyer_id, order_id, 10) tbpartitions 3;Dengan N = 10, PolarDB-X 1.0 menghitung hash dari 10 karakter terakhir kunci yang tersedia. Kueri yang difilter berdasarkan buyer_id dan kueri yang difilter berdasarkan order_id keduanya diarahkan ke shard yang sama, asalkan 10 karakter terakhir dari masing-masing pasangan tersebut cocok saat data dimasukkan.