PolarDB-X新增按主鍵類型自動拆分表功能,簡易地將分布式技術引入到普通DDL文法,您只需要執行簡單的修改,系統將根據主鍵和索引鍵自動選擇拆分鍵和拆分方式,完成從單機資料庫到分散式資料庫的切換。
前提條件
- PolarDB-X版本為5.4.9及以上。
- 建立資料庫時使用了drds模式,即“MODE”選擇為“drds/sharding”,建立資料庫時的模式選擇,請參見CREATE DATABASE。
注意事項
- 主鍵拆分表僅支援在建表時指定主鍵,不支援對已有的表添加或刪除主鍵。
- 主鍵拆分表的非LOCAL索引必須指定索引名。
- 拆分規則變更後,主鍵拆分表將變成普通表(即不再適用原主鍵拆分表中的自動拆分規則或索引轉換規則)。如何變更拆分規則,請參見變更表類型及拆分規則(DRDS模式)。
文法
在CREATE TABLE文法中新增了PARTITION關鍵字,同時,在建立索引的子句中新增了LOCAL、GLOBAL和CLUSTERED關鍵字,以適應主鍵拆分表。
CREATE PARTITION TABLE [IF NOT EXISTS] tbl_name
(create_definition, ...)
[table_options]
[drds_partition_options]
create_definition:
col_name column_definition
| mysql_create_definition
| [UNIQUE] [LOCAL | GLOBAL | CLUSTERED] INDEX index_name [index_type] (index_col_name,...)
[global_secondary_index_option]
[index_option] ...
- LOCAL:強制指定為本地索引。
- GLOBAL:全域二級索引。
- CLUSTERED:聚簇索引。
說明 關於CREATE TABLE的詳細文法介紹,請參見CREATE TABLE(DRDS模式)。
如果不想修改DDL,想使用普通單庫單表的DDL直接建立主鍵拆分表,您可以通過在SQL命令列中設定使用者變數的方式開啟主鍵拆分,方法如下:
- 執行set @auto_partition=1;命令,開啟自動主鍵拆分。
- 執行CREATE TABLE語句建立表(無需附加PARTITION關鍵字),該動作將被視為建立主鍵拆分表。
- 執行set @auto_partition=0;命令,關閉自動主鍵拆分。
自動拆分規則
- 如果目標表沒有指定主鍵,PolarDB-X會啟用隱式主鍵並將其作為拆分鍵,該主鍵為BIGINT類型的自增主鍵,且對使用者不可見。
- 如果目標表指定了主鍵,PolarDB-X會使用該主鍵作為拆分鍵。如果為複合主鍵,則選擇複合主鍵的第一列作為拆分鍵。
- 自動拆分僅拆分資料庫,不拆分資料表,且拆分演算法根據主鍵類型自動選擇:
主鍵類型 拆分演算法 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、CHAR、VARCHAR HASH DATE、DATETIME、TIMESTAMP YYYYDD BIT、FLOAT、DOUBLE、TIME、YEAR、BLOB、ENUM、DECIMAL、BINARY、TEXT、SET、GEOMETRY 不支援拆分
索引轉換規則
- 如果指定了LOCAL關鍵字,即強制指定索引為本地索引。
- 對主鍵拆分表執行建立索引操作時,如果未指定LOCAL關鍵字,該操作將被自動地轉變為建立無覆蓋列(covering)的全域二級索引,並且按索引列的第一列進行自動拆分。如果需要建立普通的局部索引,您需要指定LOCAL關鍵字。
- 建立全域二級索引和聚簇索引時,會建立一個帶
_local_
首碼的本地索引。如果刪除全域二級索引,PolarDB-X會自動同步刪除對應的本地索引。 - 主鍵拆分表可以不指定全域二級索引、聚簇索引的拆分方式,PolarDB-X會根據自動拆分原則對索引鍵的第一列執行拆分。
下述語句及其注釋為您展示了索引的轉換規則。
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`), -- 強制指定為本地索引
UNIQUE LOCAL INDEX `l_order` using btree (`order_id`), -- 強制指定為本地唯一索引
INDEX `i_seller` using btree (`seller_id`), -- 會被替換為GSI,自動拆分
UNIQUE INDEX `i_order` using btree (`order_id`), -- 會被替換為UGSI,自動拆分
GLOBAL INDEX `g_seller` using btree (`seller_id`), -- 自動拆分
UNIQUE GLOBAL INDEX `g_order` using btree (`order_id`), -- 自動拆分
CLUSTERED INDEX `c_seller` using btree (`seller_id`), -- 自動拆分聚簇
UNIQUE CLUSTERED INDEX `c_order` using btree (`order_id`) -- 自動拆分聚簇
);
執行show 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,
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`),
UNIQUE CLUSTERED KEY `c_order` USING BTREE (`order_id`) DBPARTITION BY HASH(`order_id`),
CLUSTERED INDEX `c_seller` USING BTREE(`seller_id`) DBPARTITION BY HASH(`seller_id`),
UNIQUE GLOBAL KEY `g_order` USING BTREE (`order_id`) DBPARTITION BY HASH(`order_id`),
GLOBAL INDEX `g_seller` USING BTREE(`seller_id`) DBPARTITION BY HASH(`seller_id`),
UNIQUE GLOBAL KEY `i_order` USING BTREE (`order_id`) DBPARTITION BY HASH(`order_id`),
GLOBAL INDEX `i_seller` USING BTREE(`seller_id`) DBPARTITION BY HASH(`seller_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 |
+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec)
主鍵拆分表的DDL限制
如需對主鍵拆分表執行下述DDL操作,存在一些限制。
DDL類別 | DDL子句 | 說明與限制 |
CREATE INDEX | 無 |
|
ALTER TABLE | ADD {INDEX | KEY} [index_name] [index_type] (key_part,...) [index_option] ... | |
ADD [COLUMN] (col_name column_definition,...) |
| |
DROP [COLUMN] col_name | 不允許刪除主鍵、主表拆分鍵、索引表拆分鍵和複合UNIQUE約束中的列。 | |
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 } | 支援復原操作。 說明 如果列的預設值為current_timestamp,則不支援復原操作。 |