コンポジットパーティショニング (サブパーティショニングとも呼ばれます) は、各 1 次パーティションをサブパーティションに分割し、2 次元のデータ分散を実現します。例えば、2 つの KEY パーティションがあり、それぞれに 4 つのサブパーティションがあるテーブルは、合計で 8 つの物理パーティションになります。
PolarDB for Xscale は、以下の KEY ベースのコンポジットパーティションの組み合わせをサポートしています。
| 組み合わせ | 2 次パーティションタイプ |
|---|---|
| KEY-HASH | HASH |
| KEY-KEY | KEY |
| KEY-RANGE | RANGE |
| KEY-RANGE COLUMNS | RANGE COLUMNS |
| KEY-LIST | LIST |
| KEY-LIST COLUMNS | LIST COLUMNS |
各組み合わせは、2 つの構文形式をサポートしています。
テンプレート構文:すべての 1 次パーティションが同じサブパーティション定義を共有します。サブパーティションのテンプレートを一度指定すると、PolarDB はそれをすべてのパーティションに均一に適用します。
非テンプレート構文:各 1 次パーティションが独立して独自のサブパーティションを定義するため、パーティションごとに異なるサブパーティション数や境界値を割り当てることができます。
KEY-HASH 2 次パーティション
テンプレート構文
CREATE TABLE tb_k_h_tp(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(bid, name)
PARTITIONS 2
SUBPARTITION BY HASH(id)
SUBPARTITIONS 4これにより、2 つの KEY パーティションが作成され、それぞれに 4 つの HASH サブパーティションが割り当てられ、合計で 8 つの物理パーティションになります。
非テンプレート構文
CREATE TABLE tb_k_h_ntp(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(bid, name)
PARTITIONS 2
SUBPARTITION BY HASH(id)
(
PARTITION p1 SUBPARTITIONS 2,
PARTITION p2 SUBPARTITIONS 4
)p1 には 2 つの HASH サブパーティションが、p2 には 4 つの HASH サブパーティションが割り当てられ、合計で 6 つの物理パーティションになります。
KEY-KEY 2 次パーティション
テンプレート構文
CREATE TABLE tb_k_k_tp(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(bid,name)
PARTITIONS 2
SUBPARTITION BY KEY(id)
SUBPARTITIONS 4これにより、2 つの KEY パーティションが作成され、それぞれに 4 つの KEY サブパーティションが割り当てられ、合計で 8 つの物理パーティションになります。
非テンプレート構文
CREATE TABLE tb_k_k_ntp(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(bid,name)
PARTITIONS 2
SUBPARTITION BY KEY(id)
(
PARTITION p1 SUBPARTITIONS 2,
PARTITION p2 SUBPARTITIONS 4
)p1 には 2 つの KEY サブパーティションが、p2 には 4 つの KEY サブパーティションが割り当てられ、合計で 6 つの物理パーティションになります。
KEY-RANGE 2 次パーティション
テンプレート構文
CREATE TABLE tb_k_r_tp(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(bid,name)
PARTITIONS 2
SUBPARTITION BY RANGE(id) (
SUBPARTITION sp1 VALUES LESS THAN(1000),
SUBPARTITION sp2 VALUES LESS THAN(MAXVALUE)
)両方の KEY パーティションは、同じ RANGE サブパーティションの境界を共有します。id < 1000 は sp1 にマッピングされ、残りのすべての行は sp2 に格納されます。
非テンプレート構文
CREATE TABLE tb_k_r_ntp(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(bid,name)
PARTITIONS 2
SUBPARTITION BY RANGE(id)
(
PARTITION p1 (
SUBPARTITION sp1 VALUES LESS THAN(1000),
SUBPARTITION sp2 VALUES LESS THAN(MAXVALUE)
),
PARTITION p2 (
SUBPARTITION sp3 VALUES LESS THAN(1000),
SUBPARTITION sp4 VALUES LESS THAN(2000),
SUBPARTITION sp5 VALUES LESS THAN(MAXVALUE)
)
)p1 には 2 つの RANGE サブパーティションがあり、p2 には 3 つの RANGE サブパーティションがあり、パーティションごとに異なる境界値が設定されています。
KEY-RANGE COLUMNS 2 次パーティション
テンプレート構文
CREATE TABLE tb_k_rc_tp(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(bid,name)
PARTITIONS 2
SUBPARTITION BY RANGE COLUMNS(birthday,id) (
SUBPARTITION sp1 VALUES LESS THAN('2000-01-01',1000),
SUBPARTITION sp2 VALUES LESS THAN(MAXVALUE,MAXVALUE)
)両方の KEY パーティションは、同じ RANGE COLUMNS サブパーティションの境界を共有します。
非テンプレート構文
CREATE TABLE tb_k_rc_ntp(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(bid,name)
PARTITIONS 2
SUBPARTITION BY RANGE COLUMNS(birthday,id)
(
PARTITION p1 (
SUBPARTITION sp1 VALUES LESS THAN('2000-01-01',1000),
SUBPARTITION sp2 VALUES LESS THAN(MAXVALUE,MAXVALUE)
),
PARTITION p2 (
SUBPARTITION sp3 VALUES LESS THAN('2000-01-01',1000),
SUBPARTITION sp4 VALUES LESS THAN('2020-01-01',2000),
SUBPARTITION sp5 VALUES LESS THAN(MAXVALUE,MAXVALUE)
)
)p1 には 2 つの RANGE COLUMNS サブパーティションがあり、p2 には 3 つの RANGE COLUMNS サブパーティションがあり、パーティションごとに異なる境界値が設定されています。
KEY-LIST 2 次パーティション
テンプレート構文
非テンプレート構文
CREATE TABLE tb_k_l_ntp(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(bid,name)
PARTITIONS 2
SUBPARTITION BY LIST(id)
(
PARTITION p1 (
SUBPARTITION sp1 VALUES IN (1000,2000),
SUBPARTITION sp2 VALUES IN (3000,4000),
SUBPARTITION sp3 VALUES IN (DEFAULT)
),
PARTITION p2 (
SUBPARTITION sp4 VALUES IN (5000,6000),
SUBPARTITION sp5 VALUES IN (DEFAULT)
)
)各パーティションは独自の LIST 値を定義します。明示的にリストされたどの値とも一致しない行をキャプチャするには、DEFAULT を使用します。
KEY-LIST COLUMNS 2 次パーティション
テンプレート構文
CREATE TABLE tb_k_lc_tp(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(bid,name)
PARTITIONS 2
SUBPARTITION BY LIST COLUMNS(birthday,id)
(
SUBPARTITION sp1 VALUES IN (('2000-01-01',1000),('2000-02-01',2000)),
SUBPARTITION sp2 VALUES IN (('2001-01-01',3000),('2001-02-01',4000)),
SUBPARTITION sp3 VALUES IN (DEFAULT)
)すべての 1 次パーティションは、同じ LIST COLUMNS サブパーティション定義を共有します。
非テンプレート構文
CREATE TABLE tb_k_lc_ntp(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(bid,name)
PARTITIONS 2
SUBPARTITION BY LIST COLUMNS(birthday,id)
(
PARTITION p1 (
SUBPARTITION sp1 VALUES IN (('2000-01-01',1000),('2000-02-01',2000)),
SUBPARTITION sp2 VALUES IN (('2001-01-01',3000),('2001-02-01',4000)),
SUBPARTITION sp3 VALUES IN (DEFAULT)
),
PARTITION p2 (
SUBPARTITION sp4 VALUES IN (('2002-01-10',5000),('2002-02-10',6000)),
SUBPARTITION sp5 VALUES IN (DEFAULT)
)
)注意事項
| ルール | 詳細 |
|---|---|
| 合計パーティション数 | 物理パーティションの総数は、1 次パーティションの数に、各パーティションのサブパーティションの数を掛けたものと等しくなります。テンプレート構文の場合、すべての 1 次パーティションは同じサブパーティション数を共有します。 |
| テンプレートなしの柔軟性 | 非テンプレート構文では、上記の KEY-RANGE および KEY-LIST の例で示されているように、各 1 次パーティションで異なる数のサブパーティションと異なる境界値を持つことができます。 |