分区使用场景
下面模拟在本地启动一个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 &
主键分区
对主键索引列进行分区称为主键分区。
语法格式
创建主键分区表的语法格式如下:
- 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