Tema ini menjelaskan aturan sharding otomatis dan aturan konversi indeks tabel yang di-shard secara otomatis berdasarkan primary key dalam mode partisi otomatis.
Secara default, jika Anda tidak menentukan metode partisi saat membuat database dalam mode partisi otomatis, tabel dalam database akan di-shard berdasarkan primary key.
Prasyarat
- Versi PolarDB-X adalah 5.4.13 atau lebih baru.
- Parameter MODE disetel ke auto/partitioning saat Anda membuat database. Untuk informasi lebih lanjut tentang cara memilih mode untuk partisi saat membuat database, lihat CREATE DATABASE.
Catatan penggunaan
- Anda dapat menentukan tabel sebagai tabel tunggal atau tabel replikasi saat membuat tabel. Secara default, semua tabel adalah tabel partisi saat dibuat, dan tabel tersebut di-shard berdasarkan primary key.
- Anda harus menentukan primary key untuk tabel yang di-shard secara otomatis berdasarkan primary key saat membuat tabel. Setelah tabel dibuat, primary key tidak dapat dibuat untuk tabel tersebut, dan primary key tabel tidak dapat dihapus. Jika primary key tidak ditentukan saat Anda membuat tabel, primary key implisit akan dibuat secara otomatis.
- Secara default, indeks tabel yang di-shard secara otomatis berdasarkan primary key adalah indeks sekunder global kecuali kolom pertama tidak mendukung sharding otomatis atau indeks ditentukan sebagai indeks lokal.
- Setelah Anda mengubah aturan sharding tabel yang di-shard secara otomatis berdasarkan primary key, tabel menjadi tabel standar. Dalam hal ini, aturan sharding otomatis dan aturan konversi indeks tidak berlaku untuk tabel. Untuk informasi lebih lanjut tentang cara mengubah aturan sharding, lihat Ubah Tipe dan Aturan Partisi Tabel (Mode AUTO).
- Dalam database yang menggunakan mode partisi otomatis, nama indeks sekunder global (GSI) bersifat opsional dan tidak perlu unik dalam pernyataan yang digunakan untuk membuat tabel. Akhiran acak diberikan ke semua tabel GSI. Anda dapat menjalankan perintah
show full create tableuntuk melihat akhiran tersebut.
Sintaksis
Dalam mode partisi otomatis, sharding otomatis diaktifkan secara default. Anda tidak perlu menambahkan kata kunci tertentu ke pernyataan yang digunakan untuk membuat tabel. Untuk informasi lebih lanjut tentang sintaksis pernyataan yang digunakan untuk membuat tabel, lihat CREATE TABLE (Mode AUTO).
Contoh berikut menunjukkan bagaimana tabel di-shard menggunakan sharding otomatis. Dalam contoh-contoh ini, show create table dijalankan untuk menampilkan informasi skema sederhana dari tabel-tabel tersebut. Perintah show full create table dijalankan untuk menampilkan informasi skema lengkap dari tabel-tabel tersebut.
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)
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 sharding otomatis
- Jika tabel yang ingin Anda shard tidak dikonfigurasi dengan primary key, PolarDB-X menggunakan primary key implisit sebagai shard key. Shard key adalah BIGINT auto-increment primary key dan tidak terlihat oleh pengguna. Anda dapat menjalankan
show full create tableuntuk melihat detail sharding. - Jika primary key ditentukan untuk tabel yang ingin Anda shard, PolarDB-X menggunakan primary key tabel sebagai shard key. Jika composite key ditentukan untuk tabel yang ingin Anda shard, semua kolom dalam composite key digunakan sebagai shard key.
- Misalkan composite key dan parameter yang digunakan untuk mempartisi data berdasarkan urutan ditentukan. Jika tipe data kolom tidak didukung, kolom dilewati. Jika tipe data kolom pertama tidak didukung, kesalahan dilaporkan. Dalam hal ini, Anda harus secara manual menentukan tabel sebagai tabel tunggal. Untuk informasi lebih lanjut tentang pernyataan yang digunakan untuk membuat tabel tunggal, lihat Tabel Non-partisi.
- Sharding otomatis menggunakan algoritma sharding berdasarkan tabel partisi. Sistem secara otomatis memilih algoritma sharding berdasarkan tipe data primary key.
| Tipe data primary key | Algoritma sharding |
| bit, float, double, time, year, tinyblob, blob, mediumblob, longblob, enum, decimal, binary, varbinary, tinytext, text, mediumtext, longtext, set, geometry | Tidak didukung |
| Tipe data lainnya | Partisi berdasarkan key |
Aturan konversi indeks
- Jika Anda menentukan kata kunci LOCAL saat membuat indeks, indeks tersebut adalah indeks lokal.
- Jika Anda tidak menentukan kata kunci LOCAL saat membuat indeks untuk tabel yang di-shard secara otomatis berdasarkan primary key, indeks sekunder global berdasarkan covering dibuat dan di-shard berdasarkan aturan sharding otomatis yang dijelaskan pada bagian sebelumnya. Jika Anda ingin membuat indeks lokal, Anda harus menentukan kata kunci LOCAL.
- Saat algoritma sharding dihasilkan untuk indeks sekunder global, semua kunci indeks digunakan untuk sharding. Pada saat yang sama, primary key digunakan sebagai parameter algoritma sharding untuk skenario tanpa batasan UNIQUE.
- Saat Anda membuat indeks sekunder global atau indeks terkluster, indeks lokal yang namanya berisi awalan _local_ dibuat secara otomatis. Saat Anda menghapus indeks sekunder global, PolarDB-X secara otomatis menghapus indeks lokal yang sesuai dengan indeks sekunder global.
- Jika Anda tidak menentukan shard key untuk indeks sekunder global atau indeks terkluster, PolarDB-X menggunakan kunci indeks sebagai shard key berdasarkan aturan sharding otomatis.
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`), -- Buat indeks lokal.
-> UNIQUE LOCAL INDEX `l_order` using btree (`order_id`), -- Buat indeks lokal unik.
-> INDEX `i_seller` using btree (`seller_id`), -- Buat indeks sekunder global. Tabel indeks di-shard secara otomatis.
-> UNIQUE INDEX `i_order` using btree (`order_id`), -- Buat indeks sekunder global unik. Tabel indeks di-shard secara otomatis.
-> GLOBAL INDEX `g_seller` using btree (`seller_id`), -- Buat indeks global. Tabel indeks di-shard secara otomatis.
-> UNIQUE GLOBAL INDEX `g_order` using btree (`order_id`), -- Buat indeks global unik. Tabel indeks di-shard secara otomatis.
-> CLUSTERED INDEX `c_seller` using btree (`seller_id`), -- Buat indeks terkluster. Tabel indeks di-shard secara otomatis.
-> UNIQUE CLUSTERED INDEX `c_order` using btree (`order_id`) -- Buat indeks terkluster unik. Tabel indeks di-shard secara 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 dan deskripsi pernyataan DDL yang dapat dieksekusi pada tabel yang di-shard secara otomatis berdasarkan primary key
Tabel berikut menjelaskan pernyataan DDL yang dapat dieksekusi dan operasi yang dapat dilakukan oleh klausa DDL pada tabel yang di-shard.
| Pernyataan DDL | Klausa | Deskripsi |
| CREATE INDEX | N/A |
|
| ALTER TABLE | ADD {INDEX | KEY} [index_name] [index_type] (key_part,...) [index_option] ... | |
| ADD [COLUMN] (col_name column_definition,...) |
| |
| DROP [COLUMN] col_name | Anda tidak dapat menggunakan klausa ini untuk menghapus primary key atau shard key tabel, shard key tabel indeks, atau kolom unik dari indeks komposit. | |
| CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name] |
| |
| MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name] | ||
| ALTER TABLE tbl_name ALTER [COLUMN] col_name { SET DEFAULT {literal | (expr)} | DROP DEFAULT } | Anda dapat menggunakan klausa ini untuk menentukan atau menghapus nilai default kolom. Anda dapat membatalkan operasi. Catatan Jika data dalam kolom yang ditentukan adalah tipe CURRENT_TIMESTAMP, Anda tidak dapat membatalkan operasi yang dilakukan pada kolom tersebut. |