All Products
Search
Document Center

PolarDB:LIST DEFAULT HASH

Last Updated:Mar 29, 2026

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.

LIST DEFAULT HASH

Cara kerja

  1. Setiap baris yang dimasukkan dievaluasi berdasarkan aturan partisi list.

  2. Baris yang cocok dengan klausa VALUES IN dimasukkan ke partisi list yang sesuai.

  3. Baris yang tidak cocok dengan aturan list mana pun dimasukkan ke partisi default.

  4. 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

BatasanDetail
Partisi defaultSatu atau beberapa partisi default dapat dibuat.
Kombinasi subpartisiSubpartisi 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 DEFAULT

Parameter

ParameterDeskripsi
table_nameNama tabel.
partition_nameUntuk 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_nameNama subpartisi. Harus unik dalam tabel. Setiap partisi hanya mendukung paling banyak satu subpartisi DEFAULT.
numberJumlah 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 VALIDATION

Example

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.

Penting

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: 0

Error: 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 partitions

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

Langkah selanjutnya

When to use list default hash partitioning