Saat nilai partisi list terdistribusi secara tidak merata atau tidak dapat dienumerasi sepenuhnya, partisi LIST standar akan gagal memasukkan setiap baris yang nilainya tidak tercantum dalam klausa VALUES IN—operasi INSERT mengembalikan error. LIST DEFAULT HASH mengatasi masalah ini dengan menambahkan satu atau beberapa partisi default yang menangkap semua baris yang tidak cocok. Jika terdapat beberapa partisi default, aturan hash mendistribusikan baris-baris tersebut ke partisi-partisi tersebut secara merata.

Cara kerja
Setiap baris yang dimasukkan dievaluasi berdasarkan aturan partisi list.
Baris yang cocok dengan klausa
VALUES INdimasukkan ke partisi list yang sesuai.Baris yang tidak cocok dengan aturan list mana pun dimasukkan ke partisi default.
Jika terdapat beberapa partisi default, aturan hash mendistribusikan baris yang tidak cocok ke seluruh partisi tersebut.
Persyaratan versi
LIST DEFAULT HASH memerlukan salah satu versi kluster berikut. Untuk memeriksa versi Anda, lihat Query an engine version.
PolarDB for MySQL 8.0.1, versi revisi 8.0.1.1.34 atau lebih baru
PolarDB for MySQL 8.0.2, versi revisi 8.0.2.2.1 atau lebih baru
Batasan
| Batasan | Detail |
|---|---|
| Partisi default | Satu atau beberapa partisi default dapat dibuat. |
| Kombinasi subpartisi | Subpartisi list dan default dapat dikombinasikan, tetapi setiap partisi hanya mendukung paling banyak satu subpartisi default. |
| Jenis subpartisi (satu default) | Jika hanya ada satu partisi default, subpartisi dapat berupa jenis apa pun. |
| Jenis subpartisi (beberapa default) | Jika terdapat beberapa partisi default, hanya subpartisi hash atau key yang didukung. |
Buat tabel partisi list default hash
Sintaks
CREATE TABLE [schema.]table_name
table_definition
PARTITION BY LIST [COLUMNS] (expr)
SUBPARTITION BY ...
(list_partition_definition[, ..., list_partition_definition],
default_partition_definition
)Di mana default_partition_definition adalah:
PARTITION partition_name DEFAULT [PARTITIONS number]Untuk menambahkan subpartisi default di dalam suatu partisi:
SUBPARTITION subpartition_name DEFAULTParameter
| Parameter | Deskripsi |
|---|---|
table_name | Nama tabel. |
partition_name | Untuk satu partisi default: nama partisi, yang harus berbeda dari semua nama partisi lain dalam tabel. Untuk beberapa partisi default: awalan nama; partisi aktual diberi nama partition_name0, partition_name1, dan seterusnya. |
subpartition_name | Nama subpartisi. Harus unik dalam tabel. Setiap partisi hanya mendukung paling banyak satu subpartisi DEFAULT. |
number | Jumlah partisi default saat menggunakan aturan hash. Opsional — jika dihilangkan, satu partisi default akan dibuat. |
Contoh
Buat satu partisi default
Semua baris dengan nilai di luar 1–10 dimasukkan ke partisi pd.
CREATE TABLE list_default (
a INT,
b INT
)
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (1,2,3,4,5),
PARTITION p1 VALUES IN (6,7,8,9,10),
PARTITION pd DEFAULT);Buat beberapa partisi default
Baris yang tidak cocok didistribusikan ke tiga partisi default (pd0, pd1, pd2) menggunakan aturan hash.
CREATE TABLE list_default_hash (
a INT,
b INT
)
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (1,2,3,4,5),
PARTITION p1 VALUES IN (6,7,8,9,10),
PARTITION pd DEFAULT PARTITIONS 3);Jalankan EXPLAIN untuk memastikan tata letak partisi:
EXPLAIN SELECT * FROM list_default_hash;Output yang diharapkan:
+----+-------------+-------------------+-------------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------------+-------------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | list_default_hash | p0,p1,pd0,pd1,pd2 | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | NULL |
+----+-------------+-------------------+-------------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set (0.04 sec)Buat beberapa partisi default dengan kolom VARCHAR
CREATE TABLE t_goods
(
country VARCHAR(30),
year VARCHAR(60),
goods TEXT
) PARTITION BY LIST COLUMNS(country)
(
PARTITION p1 VALUES IN ('China'),
PARTITION p2 VALUES IN ('USA'),
PARTITION p3 VALUES IN ('Asia'),
PARTITION p3 VALUES IN ('Singapore'),
PARTITION p_deft DEFAULT PARTITIONS 5
);Buat tabel dengan subpartisi default
Saat hanya ada satu partisi default, subpartisi dapat berupa jenis apa pun. Contoh berikut menggunakan subpartisi list dengan satu subpartisi default per partisi.
CREATE TABLE test (a INT, b INT)
PARTITION BY RANGE(a)
SUBPARTITION BY LIST(b) (
PARTITION part0 VALUES LESS THAN (10)
( SUBPARTITION sub0 VALUES IN (1,2,3,4,5),
SUBPARTITION sub1 DEFAULT),
PARTITION part1 VALUES LESS THAN (20)
( SUBPARTITION sub2 VALUES IN (1,2,3,4,5),
SUBPARTITION sub3 DEFAULT),
PARTITION part2 VALUES LESS THAN (30)
( SUBPARTITION sub4 VALUES IN (1,2,3,4,5),
SUBPARTITION sub5 DEFAULT));Buat tabel dengan subpartisi hash pada beberapa partisi default
Saat terdapat beberapa partisi default, hanya subpartisi hash atau key yang didukung.
CREATE TABLE list_default_hash_sub (
a INT,
b INT
)
PARTITION BY LIST (a)
SUBPARTITION BY HASH (b) SUBPARTITIONS 20
(PARTITION p0 VALUES IN (1,2,3,4,5),
PARTITION p1 VALUES IN (6,7,8,9,10),
PARTITION pd DEFAULT PARTITIONS 3);Ubah tabel partisi list default hash
Tabel partisi LIST DEFAULT HASH mendukung pernyataan ALTER TABLE berikut: ADD PARTITION, DROP PARTITION, REORGANIZE PARTITION, TRUNCATE PARTITION, EXCHANGE PARTITION, OPTIMIZE PARTITION, REBUILD PARTITION, REPAIR PARTITION, ANALYZE PARTITION, dan CHECK PARTITION.
Bagian berikut mencakup ADD PARTITION, DROP PARTITION, dan REORGANIZE PARTITION. Untuk pernyataan lainnya, lihat Modify a partitioned table.
Tambahkan partisi
Tambahkan partisi default
Jika tabel saat ini hanya memiliki partisi list, tambahkan partisi default untuk mengonversinya menjadi tabel partisi list default hash.
ALTER TABLE table_name ADD PARTITION (default_partition_definition)Tambahkan satu partisi default
CREATE TABLE list_tab (
a INT,
b INT
)
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (1,2,3,4,5),
PARTITION p1 VALUES IN (6,7,8,9,10)
);
ALTER TABLE list_tab ADD PARTITION (PARTITION pd DEFAULT);Tambahkan dua partisi default
CREATE TABLE list_tab (
a INT,
b INT
)
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (1,2,3,4,5),
PARTITION p1 VALUES IN (6,7,8,9,10)
);
ALTER TABLE list_tab ADD PARTITION (PARTITION pd DEFAULT PARTITIONS 2);Tambahkan partisi list
Tersedia di PolarDB for MySQL 8.0.2.2.11 dan versi lebih baru.
Menambahkan partisi list baru biasanya memicu pemindaian penuh pada partisi default untuk memverifikasi bahwa tidak ada baris yang sudah ada yang termasuk dalam partisi baru tersebut. Jika partisi default berisi data dalam jumlah besar, pemindaian ini bisa lambat. Untuk melewatinya, tambahkan WITHOUT VALIDATION ke pernyataan tersebut—tetapi hanya jika Anda yakin bahwa tidak ada data di partisi default yang cocok dengan nilai list baru.
Jika Anda tidak dapat memastikannya, gunakan ALTER TABLE REORGANIZE PARTITION sebagai gantinya untuk memisahkan data yang cocok dari partisi default sebelum menambahkan partisi list baru.
ALTER TABLE table_name ADD PARTITION (
list_partition_definition[, ..., list_partition_definition])
WITHOUT VALIDATIONExample
CREATE TABLE list_default_hash (
a INT,
b INT
)
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (1,2,3,4,5),
PARTITION p1 VALUES IN (6,7,8,9,10),
PARTITION pd DEFAULT PARTITIONS 3);
ALTER TABLE list_default_hash ADD PARTITION (
PARTITION p2 VALUES IN (11,12,13)
) WITHOUT VALIDATION;Setelah pernyataan dijalankan, partisi p2 ditambahkan ke list_default_hash dan tidak berisi data.
Saat menggunakan WITHOUT VALIDATION, pastikan bahwa partisi default tidak berisi baris dengan nilai a sebesar 11, 12, atau 13. Jika ada, baris-baris tersebut menjadi tidak dapat diakses setelah partisi list baru ditambahkan.
Hapus partisi
Untuk referensi lengkap tentang DROP PARTITION, lihat DROP PARTITION.
DROP PARTITION menghapus semua partisi default sekaligus. Menghapus hanya sebagian dari partisi default tidak didukung.
Hapus semua partisi default
ALTER TABLE list_default_hash DROP PARTITION pd0,pd1,pd2;Query OK, 0 rows affected (0.33 sec)
Records: 0 Duplicates: 0 Warnings: 0Error: menghapus sebagian partisi default
Mencoba menghapus hanya beberapa partisi default menghasilkan error:
ALTER TABLE list_default_hash DROP PARTITION pd0;ERROR 8078 (HY000): DROP PARTITION cannot be used on default partitions of LIST DEFAULT, except once dropping all default partitionsReorganisasi partisi
Untuk referensi lengkap tentang REORGANIZE PARTITION, lihat REORGANIZE PARTITION.
REORGANIZE PARTITION bekerja pada semua partisi default sekaligus. Memodifikasi hanya sebagian dari partisi default tidak didukung.
Ubah jumlah partisi default
Pernyataan berikut meningkatkan jumlah partisi default dari dua menjadi tiga:
ALTER TABLE list_default_hash
REORGANIZE PARTITION pd0, pd1
INTO (
PARTITION pd DEFAULT PARTITIONS 3);Pisahkan partisi list dari partisi default
Pernyataan berikut membuat partisi list baru p2 yang berisi baris yang cocok dengan VALUES IN (20,21), diambil dari partisi default:
ALTER TABLE list_default_hash
REORGANIZE PARTITION pd0, pd1
INTO (
PARTITION p2 VALUES IN (20,21),
PARTITION pd DEFAULT PARTITIONS 2);Gabungkan partisi list ke dalam partisi default
Pernyataan berikut memindahkan semua baris dari partisi list p2 kembali ke partisi default:
ALTER TABLE list_default_hash
REORGANIZE PARTITION p2, pd0, pd1
INTO (
PARTITION pd DEFAULT PARTITIONS 2);Perluas himpunan nilai partisi list
Pernyataan berikut memperluas p2 dari VALUES IN (20,21) menjadi VALUES IN (20,21,22,23,24). Baris di partisi default yang cocok dengan nilai baru dipindahkan ke p2:
ALTER TABLE list_default
REORGANIZE PARTITION p2, pd0, pd1
INTO (
PARTITION p2 VALUES IN (20,21,22,23,24),
PARTITION pd DEFAULT PARTITIONS 4);