本文介绍多主集群分区表的创建和使用方法。
背景信息
PolarDB MySQL版多主集群分区表支持根据预设的分布规则,将数据自动拆分到集群内的多个物理分片,并由多个读写节点共同承载业务负载。
通过水平拆分,PolarDB能够横向扩展数据库的处理能力。同时,多主集群分区表结合了共享存储按需分配资源的优势,有助于提升资源利用率。
适用范围
PolarDB MySQL版产品系列为多主集群(Limitless),且内核版本为8.0.2版本。
已创建高权限账号。具体操作请参见创建和管理数据库账号。
已连接到数据库集群。具体操作请参见连接数据库集群。
DDL语句
CREATE DATABASE
CREATE DATABASE语句用于创建数据库,并允许指定数据库的默认属性,如默认字符集和校验规则等。其语法与MySQL完全兼容。此外,您可以使用DIST_DB={'Y' | 'N'}来指示所创建的数据库是否支持分库模式的多主分区表,其中默认为'N'。
多主集群分区表目前不支持普通库转DIST_DB属性库。
语法
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_option] ...
create_option: [DEFAULT] {
CHARACTER SET [=] charset_name
| COLLATE [=] collation_name
| ENCRYPTION [=] {'Y' | 'N'}
| DIST_DB [=] {'Y' | 'N'}
}示例
创建数据库test1,并允许在该数据库中创建多主集群分区表。
CREATE DATABASE test1 DIST_DB='Y';CREATE TABLE
分库模式
CREATE TABLE语句用于创建表。在标识为DIST_DB='Y'的数据库中,可以通过DBDISTRIBUTION指定多主集群分区表的分布方式。未显式定义分片数量时,系统将根据集群配置自动确定。
语法
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[dbdistribution_options]
dbdistribution_options:
DBDISTRIBUTION BY
{ [LINEAR] HASH(expr)
| [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list)
| RANGE{(expr) | COLUMNS(column_list)}
| LIST{(expr) | COLUMNS(column_list)} }
[(dbdistribution_definition [, dbdistribution_definition] ...)]
dbdistribution_definition:
DBDISTRIBUTION distribution_name
[VALUES
{LESS THAN {(expr | value_list) | MAXVALUE}
|
IN (value_list)}]
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'string' ]
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]示例:
普通单表
CREATE database test; CREATE TABLE t1( id bigint NOT NULL, name varchar(30), PRIMARY key(id) );支持分库模式的多主分区表
使用哈希函数做拆分
创建一张多主集群分区表,采用
id列进行哈希拆分,数据分片将分布在集群的读写节点中。CREATE TABLE dist1( id bigint NOT NULL, c1 int, c2 varchar(30), PRIMARY key(id) ) dbdistribution BY hash(id);LIST分片
list是枚举值列表的集合,可以满足枚举分片的需求。在list分片中,使用DBDISTRIBUTION BY LIST(expr)来进行定义,其中expr是expression的缩写,表示一个列的值或基于列值的表达式,要求expr返回整数值。然后,可以通过VALUES IN (value_list)定义每个分片,其中value_list是以逗号分隔的整数值列表。CREATE TABLE t1 ( id INT NOT NULL, store_id INT, partition_no INT, PRIMARY key(id, partition_no) ) DBDISTRIBUTION BY LIST(partition_no) ( DBDISTRIBUTION a VALUES IN (1), DBDISTRIBUTION b VALUES IN (2) );LIST-COLUMNS分片
list column分片与list分片非常相似,使用DBDISTRIBUTION BY LIST COLUMNS(column_list)来定义,其中column_list可以是一个或多个列名,不再是表达式。事实上columns()不允许使用除列名以外的其他表达式。list columns分片不再局限于整数列,适用的类型包括:所有整数类型:TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER) 和BIGINT。
其他数值类型:例如DECIMAL和FLOAT不支持。
日期类型:DATE和DATETIME。
字符串类型:CHAR、VARCHAR、BINARY和VARBINARY。不支持TEXT和BLOB。
CREATE TABLE t3 ( id INT NOT NULL, store_id INT, partition_no varchar(20), PRIMARY key(id, partition_no) ) DBDISTRIBUTION BY LIST COLUMNS (partition_no) ( DBDISTRIBUTION a values in ('id_1'), DBDISTRIBUTION b values in ('id_2') );
ALTER TABLE
支持常用的MySQL ALTER TABLE语法。多主集群分区表不支持修改分布规则以及部分需要重新组织分片的操作,具体限制请参见本文的开发限制。
CREATE INDEX
支持常用的MySQL CREATE INDEX语法。创建主键或唯一索引时,索引必须包含全部分布键。
分布式查询
多主集群分区表支持单分片和跨分片查询。对于跨分片的只读查询,系统可结合分布式查询能力和全局只读节点执行,具体行为以集群配置和SQL支持范围为准。
全局自增列
多主集群分区表支持全局唯一的自增序列。多个读写节点并发写入时,自增值可能存在空洞,且不保证连续或严格单调递增。设计业务逻辑时,请勿依赖自增值的连续性。
CREATE TABLE t1( id int NOT NULL auto_increment, c1 int, c2 int, PRIMARY key(id, c1)) dbdistribution BY RANGE (c1) ( dbdistribution p0 VALUES less than (100), dbdistribution p1 VALUES less than (1000), dbdistribution p2 VALUES less than (10000), dbdistribution p3 VALUES less than (20000) );
Query OK, 0 rows affected (0.26 sec)
INSERT INTO t1 (c1, c2) VALUES (1, 1);
Query OK, 1 row affected (0.04 sec)开发限制
以下限制仅针对多主集群分区表:
操作 | 使用约束 |
修改分布规则或分布键 | 不支持。请在建表时合理规划分布键。 |
分片维护操作 | 不支持直接执行增加、删除、合并或重组分片等操作。 |
主键和唯一索引 | 必须包含全部分布键。 |
外键及部分特殊索引 | 暂不支持,建表或变更表结构前请确认SQL兼容性。 |
表空间和数据目录相关操作 | 暂不支持。 |