分区使用场景

​ 下面模拟在本地启动一个3节点集群,每个节点使用’—space’设置不同的分区标签:node1标签“tianjin”;node2标签“beijing”;node3标签“guangzhou”。

## node 1 > bini start \ —insecure \ —listen-addr=localhost:26257 \ —http-addr=localhost:8080 \ —space=tianjin \ ## 指定了分区(天津) —join=localhost:26257, localhost:26258, localhost:26259 &

## node 2 > ZNBase start \ —insecure \ —listen-addr=localhost:26258 \ —http-addr=localhost:8081 \ —space=beijing \ ## 指定了分区(北京) —join=localhost:26257, localhost:26258, localhost:26259 &

## node 3 > ZNBase start \ —insecure \ —listen-addr=localhost:26259 \ —http-addr=localhost:8082 \ —space=guangzhou \ ## 指定了分区(广州) —join=localhost:26257, localhost:26258, localhost:26259 &

主键分区

对主键索引列进行分区称为主键分区。

语法格式

创建主键分区表的语法格式如下:

分区使用场景 - 图1

  • opt_partition_by

表的分区语法,详见PARTITION BY章节。

  • opt_locate_in

物理归属地属性,详见LOCATE IN章节。

​ 其他各项参数的说明,参考CREATE TABLE章节。

语法示例

示例1:LIST分区

创建表t1并对主键列c1进行LIST分区。

> CREATE TABLE t1 ( c1 INT PRIMARY KEY, c2 INT ) PARTITION BY LIST ( c1 ) ( PARTITION p1 VALUES IN ( 1, 2, 3 ), PARTITION p2 VALUES IN ( 4, 5, 6 ) );

CREATE TABLE

插入落入分区p1的数据,并查询p1下的数据。

> INSERT INTO t1 VALUES (1, 2);

INSERT 1

> SELECT * FROM [PARTITION p1] OF t1;

c1 | c2

+——+——+

1 | 2 (1 row) |

插入不属于现有分区p1、p2的数据,并查询默认分区下的数据。

> INSERT INTO t1 VALUES (7, 8);

INSERT 1

> SELECT * FROM [PARTITION primary default] OF t1;

c1 | c2

+——+——+

7 | 8 (1 row) |

需要注意的是,default关键字可以作为LIST分区下的expr_list,代表现有指定分区信息之外的任意值,示例如下。

CREATE TABLE t2 ( c1 INT PRIMARY KEY, c2 INT ) PARTITION BY LIST ( c1 ) ( PARTITION p1 VALUES IN ( 1, 2, 3 ), PARTITION p2 VALUES IN ( DEFAULT ) );

CREATE TABLE

> INSERT INTO t2 VALUES(4, 5);

INSERT 1

> SELECT * FROM [PARTITION p2] OF t2;

c1 | c2

+——+——+

4 | 5

示例2:RANGE分区

创建表t3并对主键列c1进行RANGE分区。

> CREATE TABLE t3 ( c1 INT PRIMARY KEY, c2 INT ) PARTITION BY RANGE ( c1 ) ( PARTITION p1 VALUES FROM ( 100 ) TO ( 200 ), PARTITION p2 VALUES FROM ( 200 ) TO ( 300 ) );

插入落入分区p1的数据,并查询p1下的数据。

> INSERT INTO t3 VALUES (100, 101);

INSERT 1

> SELECT * FROM [PARTITION p1] OF t3;

c1 | c2

+——-+——-+

100 | 101

(1 row)

插入不属于现有分区p1、p2的数据,并查询默认分区下的数据。

> INSERT INTO t3 VALUES (300, 301);

INSERT 1

> SELECT * FROM [PARTITION primary default] OF t3;

c1 | c2

+——-+——-+

300 | 301

(1 row)

需要注意的是,maxvalue和minvalue关键字可以写入RANGE分区下的expr_list,代表概念上的最大取值和最小取值,示例如下。

> CREATE TABLE t4 ( c1 INT PRIMARY KEY, c2 INT ) PARTITION BY RANGE ( c1 ) ( PARTITION p1 VALUES FROM ( 100 ) TO ( 300 ), PARTITION p2 VALUES FROM ( minvalue ) TO ( 100 ), PARTITION p3 VALUES FROM( 300 ) TO ( MAXVALUE ) );

CREATE TABLE

> INSERT INTO t4 VALUES(300, 301), (0, 1);

INSERT 2

> SELECT * FROM [PARTITION p2] OF t4;

c1 | c2

+——+——+

0 | 1 (1 row)

> SELECT * FROM [PARTITION p3] OF t4;

c1 | c2

+——-+——-+

300 | 301

示例3:locate in

创建不指定物理归属地属性的分区。

> create table student1 ( id int, hometown string, name string, PRIMARY KEY(id, hometown)) partition by list(hometown) ( partition p1 values in(‘tianjin’), partition p2 values in(‘beijing’), );

创建指定物理归属地属性的分区。

> create table student2 ( id int, hometown string, name string, PRIMARY KEY(id, hometown)) partition by list(hometown) ( partition p1 values in(‘tianjin’) locate in tianjin, partition p2 values in(‘beijing’) locate in beijing ) locate in guangzhou;

CREATE TABLE

需要注意的是,locate in既可以指定表的位置信息,也可以指定具体分区的位置信息。

例如:表student2位于guangzhou标签所属node3 节点上,其中属于p1分区的数据位于tianjin标签所属的node1节点,p2分区位于node2节点。

示例4:创建嵌套分区。

> create table student3 ( id int, hometown string, district string, name string, PRIMARY KEY(id, hometown, district)) partition by list(hometown) ( partition p1 values in(‘tianjin’) locate in tianjin partition by list(district) ( partition p11 values in(‘heping’), partition p12 values in(‘hexi’) ), partition p2 values in(‘beijing’) locate in beijing ) locate in guangzhou;

CREATE TABLE