本文将详细介绍多主分区表的使用说明。
背景信息
PolarDB MySQL版的多主分区表是一种全新的云原生数据库,它支持自动水平拆分、混合共享存储以及shared nothing架构。同时,能够根据预设的拆分规则,将数据自动分散到多个数据库集群中,从而使每个节点均具备读写能力,实现真正的分布式处理能力。
通过水平拆分,PolarDB能够有效地实现数据库的横向扩展,线性提升整体的并发吞吐能力。同时,多主分区表的架构还结合了共享存储数据库按需资源分配的优势,确保资源利用率的最大化。
前提条件
- 已创建高权限账号。具体操作请参见创建和管理数据库账号。
- 已连接到数据库集群。具体操作请参见连接数据库集群。
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,允许在test1库中创建分库模式的多主分区表,分库数默认是8。
CREATE DATEBASE test1 DIST_DB='Y';CREATE TABLE
分库模式
CREATE TABLE语句用于创建表。对于标识为DIST_DB='Y'的数据库,仅能创建分库模式的多主分区表。使用新的关键字DBDISTRIBUTION来指定多主分区表的分布方式。目前,分库的数量固定为8个。
语法
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)
);支持分库模式的多主分区表
创建一张多主分区表,共分为8个分库,采用ID列进行哈希拆分,分库将分布在集群的各个节点中。
CREATE TABLE dist1(
id bigint NOT NULL,
c1 int,
c2 varchar(30),
PRIMARY key(id)
) dbdistribution BY hash(id);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,
partion_no INT,
PRIMARY key(id, partion_no)
) DBDISTRIBUTION BY LIST(partion_no) (
DBDISTRIBUTION a VALUES IN (1),
DBDISTRIBUTION b VALUES IN (2)
);list column分片与list分片非常相似,使用DBDISTRIBUTION BY LIST COLUMNS(column_list)来定义,其中column_list可以是一个或多个列名,不再是表达式。事实上columns()不允许使用除列名以外的其他表达式。list columns分片不再局限于整数列,适用的类型包括:
CREATE TABLE t3 (
id INT NOT NULL,
store_id INT,
partion_no varchar(20),
PRIMARY key(id, partion_no)
) DBDISTRIBUTION BY LIST COLUMNS (partion_no) (
DBDISTRIBUTION a values in ('id_1'),
DBDISTRIBUTION b values in ('id_2')
);ALTER TABLE
兼容MySQL语法,更多详细信息请参见MySQL官方网站。
CREATE INDEX
兼容MySQL语法,更多详细信息请参见MySQL官方网站。
分布式查询
对于不带分布式键过滤条件的SQL查询或跨多个分库或分表的SQL查询,可以将其路由到全局只读节点会自动汇聚所有分区的数据,可以读取所有数据,无需额外的存储和同步链路。
全局自增列
支持全局唯一的序列(sequence),能够生成自然数序列的值,但不保证这些值是连续的或单调递增的。采用批量分配的方式,主节点(master)每次会分配一段值。因此,当多个主节点同时插入数据时,生成的自增ID可能会出现不连续的情况。在每次从存储引擎获取一个批次时,首先获取当前最后一个已分配的ID,然后再获取一个批次的ID,以确定一个范围(range)。
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)开发限制
以下限制仅针对多主分区表:




