Topik ini menjelaskan kebijakan pembagian HASH untuk database PolarDB-X dalam mode pembagian otomatis.
Sintaksis
Di PolarDB-X, data didistribusikan ke partisi berbeda berdasarkan algoritma penghashan konsisten. Kebijakan pembagian HASH memungkinkan Anda menggunakan ekspresi yang mencakup fungsi pembagian untuk memproses nilai kolom kunci partisi.
Algoritma perutean untuk pembagian HASH di PolarDB-X berbeda dari yang digunakan di MySQL.
CREATE TABLE ...
PARTITION BY HASH(partition_expr)
PARTITIONS number;
partition_expr:
partition_column_list
| partition_func(partition_column)
partition_column_list:
partition_column_list[, partition_column, partition_column, ...]
# Tentukan fungsi pembagian.
partition_func:
| TO_DAYS
| TO_MONTHS
| TO_WEEKS
| TO_SECOND
| UNIX_TIMESTAMP
| MONTH
| DAYOFWEEK
| DAYOFMONTH
| DAYOFYEAR
| SUBSTR
| SUBSTRING
| RIGHT
| LEFTUntuk informasi lebih lanjut tentang perbedaan antara pembagian HASH dan Pembagian Kunci, lihat tabel Perbandingan antara Pembagian Kunci dan Pembagian HASH pada topik "Ikhtisar".
Catatan Penggunaan
Pembagian HASH memungkinkan Anda menggunakan fungsi pembagian untuk kunci partisi kolom tunggal. Namun, tipe data yang didukung untuk kolom kunci partisi bervariasi tergantung pada fungsi pembagian.
Pembagian HASH tidak mendukung penggunaan fungsi pembagian untuk kunci partisi vektor dan tidak dapat membagi partisi data panas.
Anda tidak dapat menggunakan fungsi pembagian bersarang untuk kolom kunci partisi.
Secara default, tabel terpartisi dapat memiliki hingga 8.192 partisi.
Secara default, kunci partisi dapat terdiri dari hingga lima kolom kunci partisi.
Jika Anda menggunakan kolom dengan tipe data sensitif zona waktu seperti TIMESTAMP sebagai kolom kunci partisi, gunakan fungsi pembagian UNIX_TIMESTAMP untuk kolom tersebut.
Contoh
Menggunakan fungsi pembagian
Tentukan kolom ulang tahun bertipe DATETIME sebagai kunci partisi kolom tunggal, gunakan fungsi pembagian TO_DAYS untuk mengonversi nilai kolom ulang tahun menjadi jumlah hari, lalu lakukan pembagian HASH. Atur jumlah partisi menjadi 8.
CREATE TABLE tb_h_fn(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY HASH(TO_DAYS(birthday))
PARTITIONS 8;Menggunakan kunci partisi kolom tunggal
Tentukan kolom id sebagai kunci partisi kolom tunggal untuk pembagian HASH dan atur jumlah partisi menjadi 8.
CREATE TABLE tb_h(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY HASH(id)
PARTITIONS 8;Menggunakan kunci partisi vektor
Gunakan kunci partisi vektor yang terdiri dari kolom id dan bid untuk pembagian HASH dan atur jumlah partisi menjadi 8.
Kolom id dan bid digunakan untuk menghitung nilai hash. Permintaan yang mencakup kondisi kesetaraan hanya dapat memenuhi kondisi pemangkasan partisi jika kondisi kesetaraan permintaan melibatkan kedua kolom id dan bid.
CREATE TABLE tb_h2(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY HASH(id,bid)
PARTITIONS 8;Batasan
Batasan pada tipe data
Tipe bilangan bulat: BIGINT, BIGINT UNSIGNED, INT, INT UNSIGNED, MEDIUMINT, MEDIUMINT UNSIGNED, SMALLINT, SMALLINT UNSIGNED, TINYINT, dan TINYINT UNSIGNED.
Tipe tanggal dan waktu: DATETIME, DATE, dan TIMESTAMP.
Tipe string: CHAR dan VARCHAR.
Keseimbangan distribusi data
Pembagian KUNCI dan pembagian HASH diimplementasikan berdasarkan algoritma penghashan konsisten bawaan MurmurHash3. Algoritma ini telah diuji secara luas di industri dan terbukti memiliki tingkat tabrakan data rendah serta performa tinggi. Namun, MurmurHash3 tidak menjamin keseimbangan distribusi data di setiap partisi dalam semua kasus, terutama ketika jumlah nilai berbeda dari kunci partisi relatif kecil.
Saat menggunakan Pembagian KUNCI atau pembagian HASH, distribusi data di berbagai partisi menjadi seimbang jika jumlah nilai berbeda dari kunci partisi lebih besar dari 3.000 berdasarkan algoritma MurmurHash3. Data akan didistribusikan lebih merata jika kunci partisi memiliki lebih banyak nilai berbeda.