天天看點

開發指南—透明分布式—主鍵拆分

前提條件

PolarDB-X核心小版本需為5.4.9或以上。

注意事項

  • 主鍵拆分表僅支援在建表時指定主鍵,不支援對已有的表添加或删除主鍵。
  • 主鍵拆分表的非LOCAL索引必須指定索引名。
  • 拆分規則變更後,主鍵拆分表将變成普通表(即不再适用原主鍵拆分表中的自動拆分規則或索引轉換規則)。如何變更拆分規則,請參見 變更表類型及拆分規則

文法

在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] ...      

說明 關于CREATE TABLE的詳細文法介紹,請參見

CREATE TABLE

如果不想修改DDL,想使用普通單庫單表的DDL直接建立主鍵拆分表,您可以通過在SQL指令行中設定使用者變量的方式開啟主鍵拆分,方法如下:

  1. 執行set @auto_partition=1;指令,開啟自動主鍵拆分。
  2. 執行CREATE TABLE語句建立表(無需附加PARTITION關鍵字),該動作将被視為建立主鍵拆分表。
  3. 執行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操作的詳細文法介紹,請參見

CREATE INDEX

ALTER TABLE
DDL類别 DDL子句 說明與限制
  • 如果使用了

    [UNIQUE] LOCAL INDEX

    子句,PolarDB-X将建立本地索引,且會自動同步到聚簇索引表中。
  • [UNIQUE] INDEX

    子句,PolarDB-X将其轉換為對應的全局二級索引,同時,自動建立一個帶

    _local_

    字首的本地索引并同步到聚簇索引表中。
  • [UNIQUE] GLOBAL | CLUSTERED INDEX

    子句,PolarDB-X會自動建立一個帶

    _local_

    說明 如果未指定拆分方式則會自動拆分。
ADD {INDEX | KEY} [index_name] [index_type] (key_part,...) [index_option] ...
ADD [COLUMN] (col_name column_definition,...)
  • PolarDB-X将自動添加對應的列到聚簇全局二級索引(CGSI)和帶唯一限制的聚簇全局二級索引(UCGSI)。
  • 支援復原操作。
DROP [COLUMN] col_name 不允許删除主鍵、主表拆分鍵、索引表拆分鍵和複合UNIQUE限制中的列。
CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name]
  • 不允許重命名主鍵、主表拆分鍵、索引表拆分鍵。
  • 不允許重命名複合UNIQUE限制中的列。

    說明 其它列的限制可通過執行Hint:/*+TDDL: cmd_extra(ALLOW_LOOSE_ALTER_COLUMN_WITH_GSI=true)*/指令解除。更多資訊,請參見

    Hint簡介
  • 如果僅需修改default資訊,推薦使用SET DEFAULT或DROP DEFAULT子句。
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,則不支援復原操作。