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 = autoatauMODE = 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 key | Shard key yang digunakan |
|---|---|
| Tidak ada primary key | Primary key implisit (_drds_implicit_id_): kolom auto-increment bertipe BIGINT, tidak terlihat oleh pengguna. Jalankan show full create table untuk melihatnya. |
| Primary key satu kolom | Kolom primary key tersebut |
| Primary key komposit | Semua 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_). Jalankanshow full create tableuntuk 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. Jalankanshow full create tableuntuk 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 digunakan | Indeks aktual yang dibuat |
|---|---|
[UNIQUE] LOCAL INDEX | Indeks lokal |
[UNIQUE] INDEX (tidak ada tipe yang ditentukan) | GSI, di-shard berdasarkan aturan sharding otomatis |
[UNIQUE] GLOBAL INDEX | GSI |
[UNIQUE] CLUSTERED INDEX | Clustered 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
| Klausa | Perilaku |
|---|---|
[UNIQUE] LOCAL INDEX | Membuat indeks lokal dan menambahkannya ke clustered index tabel |
[UNIQUE] INDEX | Membuat 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 INDEX | Membuat 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
| Klausa | Batasan |
|---|---|
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
CREATE TABLE: Referensi sintaks lengkap untuk membuat tabel dalam mode partisi otomatis.
Create a non-partitioned table and a broadcast table: Untuk tabel yang tipe data primary key-nya tidak didukung untuk sharding otomatis.
Change the type and modify the partitioning rule of a table: Cara mengubah aturan sharding setelah pembuatan tabel.
How to use hints: Referensi sintaks petunjuk untuk operasi DDL tingkat lanjut.