All Products
Search
Document Center

PolarDB:Sharding\ otomatis\ berdasarkan\ primary\ key\ dalam\ mode\ AUTO

Last Updated:Mar 29, 2026

Saat membuat database dalam mode partisi otomatis, PolarDB-X secara default melakukan sharding tabel berdasarkan primary key—tanpa memerlukan kata kunci partisi. Hal ini memungkinkan Anda menggunakan sintaks CREATE TABLE standar, sementara PolarDB-X secara otomatis memilih shard key dan algoritma sharding.

Topik ini mencakup aturan sharding otomatis, aturan konversi indeks, dan batasan DDL untuk tabel yang secara otomatis di-shard berdasarkan primary key.

Prasyarat

Sebelum memulai, pastikan bahwa:

  • Versi PolarDB-X Anda adalah 5.4.13 atau lebih baru.

  • Database dibuat dengan MODE = auto atau MODE = partitioning (lihat CREATE DATABASE).

Cara kerja sharding otomatis

PolarDB-X menggunakan KEY partitioning untuk tabel yang di-shard secara otomatis. Saat pembuatan tabel, sistem memeriksa kolom primary key, melewatkan kolom yang memiliki tipe data tidak didukung, lalu menggunakan kolom yang tersisa sebagai shard key—tanpa konfigurasi tambahan.

Pemilihan shard key

Tipe primary keyShard key yang digunakan
Tidak ada primary keyPrimary key implisit (_drds_implicit_id_): kolom auto-increment bertipe BIGINT, tidak terlihat oleh pengguna. Jalankan show full create table untuk melihatnya.
Primary key satu kolomKolom primary key tersebut
Primary key kompositSemua kolom dalam primary key komposit (kolom dengan tipe data tidak didukung dilewati)

Tipe data yang didukung

PolarDB-X hanya menerapkan KEY partitioning pada kolom dengan tipe data yang didukung. Jika suatu kolom memiliki tipe yang tidak didukung, sistem akan melewatkan kolom tersebut saat menyusun shard key.

Tipe yang didukung (KEY partitioning):

Tipe integer (tinyint, smallint, mediumint, int, bigint, dan varian unsigned-nya), date, datetime, timestamp, char, varchar

Tipe yang tidak didukung (tidak memenuhi syarat untuk sharding otomatis):

bit, float, double, time, year, tinyblob, blob, mediumblob, longblob, enum, decimal, binary, varbinary, tinytext, text, mediumtext, longtext, set, geometry

Perilaku primary key komposit: Jika suatu kolom dalam primary key komposit memiliki tipe yang tidak didukung, PolarDB-X akan melewatkan kolom tersebut. Jika kolom pertama dalam primary key komposit memiliki tipe yang tidak didukung, sistem akan menghasilkan error—Anda harus membuat tabel tersebut secara manual sebagai tabel non-partisi. Lihat Create a non-partitioned table and a broadcast table.

Catatan penggunaan

  • Tentukan tabel sebagai tabel tunggal atau tabel replikasi saat pembuatan jika diperlukan. Secara default, semua tabel menjadi tabel partisi yang di-shard berdasarkan primary key.

  • Tentukan primary key saat membuat tabel. Setelah dibuat, Anda tidak dapat menambahkan atau menghapus primary key.

  • Jika tidak menentukan primary key, PolarDB-X secara otomatis membuat primary key implisit (_drds_implicit_id_). Jalankan show full create table untuk melihat detail sharding-nya.

  • Indeks pada tabel yang di-shard secara otomatis secara default menjadi global secondary indexes (GSIs), kecuali tipe data kolom pertamanya tidak didukung atau Anda secara eksplisit menentukan LOCAL.

  • Nama GSI dalam mode partisi otomatis bersifat opsional dan tidak perlu unik dalam pernyataan CREATE TABLE. PolarDB-X memberikan akhiran acak pada semua tabel GSI. Jalankan show full create table untuk melihatnya.

  • Setelah Anda mengubah aturan sharding tabel yang di-shard secara otomatis, tabel tersebut menjadi tabel standar. Aturan sharding otomatis dan konversi indeks tidak lagi berlaku. Lihat Change the type and modify the partitioning rule of a table.

Sintaks dan contoh

Sharding otomatis diaktifkan secara default. Tidak diperlukan kata kunci khusus saat pembuatan tabel. Untuk sintaks lengkap CREATE TABLE, lihat CREATE TABLE.

Gunakan show create table untuk melihat skema yang disederhanakan dan show full create table untuk melihat skema lengkap termasuk detail partisi.

Contoh 1: Primary key komposit

Tabel tb memiliki primary key komposit (x, y, z, d). Karena z bertipe float (tidak didukung), PolarDB-X menggunakan x, y, dan d sebagai shard key.

CREATE TABLE `tb` (
  `x` int NOT NULL AUTO_INCREMENT,
  `y` int NOT NULL,
  `z` float NOT NULL,
  `d` int NOT NULL,
  PRIMARY KEY (x,y,z,d)
);
Query OK, 0 rows affected (0.42 sec)
show create table tb;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE                                                                                                                                                                                                                                                              |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb    | CREATE TABLE `tb` (
        `x` int(11) NOT NULL AUTO_INCREMENT,
        `y` int(11) NOT NULL,
        `z` float NOT NULL,
        `d` int(11) NOT NULL,
        PRIMARY KEY (`x`, `y`, `z`, `d`),
        LOCAL KEY `auto_shard_key_x_y_d` USING BTREE (`x`, `y`, `d`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

show full create table tb;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE                                                                          |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb    | CREATE PARTITION TABLE `tb` (
        `x` int(11) NOT NULL AUTO_INCREMENT,
        `y` int(11) NOT NULL,
        `z` float NOT NULL,
        `d` int(11) NOT NULL,
        PRIMARY KEY (`x`, `y`, `z`, `d`),
        LOCAL KEY `auto_shard_key_x_y_d` USING BTREE (`x`, `y`, `d`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`x`,`y`,`d`)
PARTITIONS 16
/* tablegroup = `tg8` */ |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Contoh 2: Primary key tunggal dengan indeks

Tabel t_order memiliki primary key tunggal bertipe int bernama x. PolarDB-X melakukan sharding berdasarkan x dan secara otomatis mengonversi kedua indeks menjadi GSIs.

CREATE TABLE `t_order` (
  `x` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `order_id` varchar(20) DEFAULT NULL,
  `seller_id` varchar(20) DEFAULT NULL,
  INDEX (`seller_id`),
  UNIQUE INDEX (`order_id`)
);
Query OK, 0 rows affected (0.84 sec)
show create table `t_order`;
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE   | CREATE TABLE                                                                                                                                                                                                                                                             |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_order | CREATE TABLE `t_order` (
        `x` int(11) NOT NULL AUTO_INCREMENT,
        `order_id` varchar(20) DEFAULT NULL,
        `seller_id` varchar(20) DEFAULT NULL,
        PRIMARY KEY (`x`),
        INDEX `i_0` (`seller_id`),
        UNIQUE INDEX `i_1` (`order_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

show full create table `t_order`;
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE   | CREATE TABLE          |
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_order | CREATE PARTITION TABLE `t_order` (
        `x` int(11) NOT NULL AUTO_INCREMENT,
        `order_id` varchar(20) DEFAULT NULL,
        `seller_id` varchar(20) DEFAULT NULL,
        PRIMARY KEY (`x`),
        GLOBAL INDEX /* i_0_$cff4 */ `i_0` (`seller_id`) PARTITION BY KEY (`seller_id`, `x`) PARTITIONS 16,
        UNIQUE GLOBAL INDEX /* i_1_$1782 */ `i_1` (`order_id`) PARTITION BY KEY (`order_id`) PARTITIONS 16,
        UNIQUE LOCAL KEY `_local_i_1` (`order_id`),
        LOCAL KEY `_local_i_0` (`seller_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`x`)
PARTITIONS 16
/* tablegroup = `tg8` */ |
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Aturan konversi indeks

Secara default, indeks pada tabel yang di-shard secara otomatis menjadi GSIs. Tentukan LOCAL secara eksplisit untuk membuat indeks lokal.

Aturan utama: Indeks secara default menjadi GSI kecuali Anda menentukan LOCAL.

Kata kunci yang digunakanIndeks aktual yang dibuat
[UNIQUE] LOCAL INDEXIndeks lokal
[UNIQUE] INDEX (tidak ada tipe yang ditentukan)GSI, di-shard berdasarkan aturan sharding otomatis
[UNIQUE] GLOBAL INDEXGSI
[UNIQUE] CLUSTERED INDEXClustered GSI

Aturan tambahan:

  • Saat PolarDB-X menghasilkan algoritma sharding untuk GSI, sistem menggunakan semua kolom kunci indeks. Untuk indeks non-UNIQUE, primary key juga disertakan sebagai parameter sharding.

  • Jika tidak ada shard key yang ditentukan untuk GSI atau clustered index, PolarDB-X menerapkan aturan sharding otomatis pada kunci indeks.

  • Membuat GSI atau clustered index juga secara otomatis membuat indeks lokal terkait yang diawali dengan _local_. Menghapus GSI secara otomatis menghapus indeks lokal terkait.

Contoh berikut membuat tabel dengan semua jenis indeks yang didukung:

CREATE PARTITION TABLE `t_order` (
  `x` int,
  `order_id` varchar(20) DEFAULT NULL,
  `seller_id` varchar(20) DEFAULT NULL,
  LOCAL INDEX `l_seller` using btree (`seller_id`),         -- Indeks lokal
  UNIQUE LOCAL INDEX `l_order` using btree (`order_id`),    -- Indeks lokal unik
  INDEX `i_seller` using btree (`seller_id`),               -- GSI (di-shard otomatis)
  UNIQUE INDEX `i_order` using btree (`order_id`),          -- GSI unik (di-shard otomatis)
  GLOBAL INDEX `g_seller` using btree (`seller_id`),        -- GSI (di-shard otomatis)
  UNIQUE GLOBAL INDEX `g_order` using btree (`order_id`),   -- GSI unik (di-shard otomatis)
  CLUSTERED INDEX `c_seller` using btree (`seller_id`),     -- Clustered GSI (di-shard otomatis)
  UNIQUE CLUSTERED INDEX `c_order` using btree (`order_id`) -- Clustered GSI unik (di-shard otomatis)
);
Query OK, 0 rows affected (1.49 sec)

show create table `t_order`;
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE   | CREATE TABLE                              |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_order | CREATE TABLE `t_order` (
        `x` int(11) DEFAULT NULL,
        `order_id` varchar(20) DEFAULT NULL,
        `seller_id` varchar(20) DEFAULT NULL,
        UNIQUE CLUSTERED INDEX `c_order` USING BTREE (`order_id`),
        CLUSTERED INDEX `c_seller` USING BTREE (`seller_id`),
        UNIQUE INDEX `g_order` USING BTREE (`order_id`),
        INDEX `g_seller` USING BTREE (`seller_id`),
        UNIQUE INDEX `i_order` USING BTREE (`order_id`),
        INDEX `i_seller` USING BTREE (`seller_id`),
        UNIQUE LOCAL KEY `l_order` USING BTREE (`order_id`),
        LOCAL KEY `l_seller` USING BTREE (`seller_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

show full create table `t_order`;
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE   | CREATE TABLE                                                                                                                                                                                                  |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_order | CREATE PARTITION TABLE `t_order` (
        `x` int(11) DEFAULT NULL,
        `order_id` varchar(20) DEFAULT NULL,
        `seller_id` varchar(20) DEFAULT NULL,
        `_drds_implicit_id_` bigint(20) NOT NULL AUTO_INCREMENT,
        PRIMARY KEY (`_drds_implicit_id_`),
        UNIQUE CLUSTERED INDEX /* c_order_$1ba0 */ `c_order` USING BTREE (`order_id`) PARTITION BY KEY (`order_id`) PARTITIONS 16,
        CLUSTERED INDEX /* c_seller_$1e39 */ `c_seller` USING BTREE (`seller_id`) PARTITION BY KEY (`seller_id`, `_drds_implicit_id_`) PARTITIONS 16,
        UNIQUE GLOBAL INDEX /* g_order_$d57f */ `g_order` USING BTREE (`order_id`) PARTITION BY KEY (`order_id`) PARTITIONS 16,
        GLOBAL INDEX /* g_seller_$6ed5 */ `g_seller` USING BTREE (`seller_id`) PARTITION BY KEY (`seller_id`, `_drds_implicit_id_`) PARTITIONS 16,
        UNIQUE GLOBAL INDEX /* i_order_$ab2f */ `i_order` USING BTREE (`order_id`) PARTITION BY KEY (`order_id`) PARTITIONS 16,
        GLOBAL INDEX /* i_seller_$2b4b */ `i_seller` USING BTREE (`seller_id`) PARTITION BY KEY (`seller_id`, `_drds_implicit_id_`) PARTITIONS 16,
        UNIQUE LOCAL KEY `l_order` USING BTREE (`order_id`),
        UNIQUE LOCAL KEY `_local_i_order` USING BTREE (`order_id`),
        UNIQUE LOCAL KEY `_local_g_order` USING BTREE (`order_id`),
        UNIQUE LOCAL KEY `_local_c_order` USING BTREE (`order_id`),
        LOCAL KEY `l_seller` USING BTREE (`seller_id`),
        LOCAL KEY `_local_i_seller` USING BTREE (`seller_id`),
        LOCAL KEY `_local_g_seller` USING BTREE (`seller_id`),
        LOCAL KEY `_local_c_seller` USING BTREE (`seller_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`_drds_implicit_id_`)
PARTITIONS 16
/* tablegroup = `tg11` */ |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

Batasan DDL

Batasan berikut berlaku untuk operasi DDL pada tabel yang di-shard secara otomatis.

CREATE INDEX

KlausaPerilaku
[UNIQUE] LOCAL INDEXMembuat indeks lokal dan menambahkannya ke clustered index tabel
[UNIQUE] INDEXMembuat GSI dan indeks lokal terkait dengan awalan _local_, keduanya ditambahkan ke clustered index. Jika tidak ada shard key yang ditentukan, aturan sharding otomatis berlaku.
[UNIQUE] GLOBAL INDEX atau [UNIQUE] CLUSTERED INDEXMembuat GSI atau clustered index, ditambah indeks lokal dengan awalan _local_ yang ditambahkan ke clustered index. Jika tidak ada shard key yang ditentukan, aturan sharding otomatis berlaku.

ALTER TABLE

KlausaBatasan
ADD {INDEX | KEY}Aturan konversi yang sama seperti CREATE INDEX berlaku.
ADD [COLUMN]Kolom baru secara otomatis ditambahkan ke semua clustered GSI dan unique clustered GSI. Rollback didukung.
DROP [COLUMN]Tidak dapat menghapus primary key, shard key tabel, shard key tabel indeks, atau kolom unik dari indeks komposit.
CHANGE [COLUMN]Tidak dapat mengganti nama primary key, shard key tabel, shard key tabel indeks, atau kolom unik dari indeks komposit. Untuk menghapus batasan kolom (kecuali kolom unik dari indeks komposit), gunakan petunjuk /*+TDDL: cmd_extra(ALLOW_LOOSE_ALTER_COLUMN_WITH_GSI=true)*/. Lihat How to use hints. Untuk mengubah nilai default kolom, gunakan SET DEFAULT atau DROP DEFAULT sebagai gantinya.
MODIFY [COLUMN]Batasan penggantian nama dan petunjuk yang sama seperti CHANGE [COLUMN] berlaku.
ALTER [COLUMN] col_name { SET DEFAULT | DROP DEFAULT }Menetapkan atau menghapus nilai default kolom. Rollback didukung, kecuali untuk kolom bertipe CURRENT_TIMESTAMP.

Langkah selanjutnya