Description of MatrixOne DDL statement partition support¶
1. Partition types supported by MatrixOne¶
Currently, the 6 partition types supported by MatrixOne’s DDL statements are basically the same as the MySQL official website, as follows:
KEY partitioning
HASH partitioning
RANGE partitioning
RANGE COLUMNS partitioning
LIST partitioning
LIST COLUMNS partitioning
2. Description of partition keys¶
The relationship between Partition Keys, Primary Keys and Unique Keys¶
The relationship rules of Partition Keys, Primary Keys and Unique Keys can be summarized as:
All columns used in the partition expression of a partition table must be part of each unique key that the table may have.
Note
The only keys include PrimaryKey and Unique KEY.
That is, each unique key on the table must use each column in the table’s partition expression. The unique key also includes the primary key of the table, because by definition, the primary key of the table is also a unique key.
Example Description¶
For example, each of the following table creation statements is invalid:
> CREATE TABLE t1 (
col1 INT NOT NULL,
col2 DATE NOT NULL,
col3 INT NOT NULL,
col4 INT NOT NULL,
UNIQUE KEY (col1, col2)
)
PARTITION BY HASH(col3)
PARTITIONS 4;
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function
> CREATE TABLE t2 (
col1 INT NOT NULL,
col2 DATE NOT NULL,
col3 INT NOT NULL,
col4 INT NOT NULL,
UNIQUE KEY (col1),
UNIQUE KEY (col3)
)
PARTITION BY HASH(col1 + col3)
PARTITIONS 4;
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function
About KEY Partition Key is NULL¶
KEY accepts only lists of zero or more column names. In the case where the table has a primary key, any column used as a partition key must contain part or all of the table primary key.
If no column name is specified as partition key, the primary key of the table is used (if any). For example, the following
CREATE TABLEstatement is valid in MySQL.If there is no primary key, but UNIQUE KEY, then UNIQUE KEY is used for partition keys.
For example, in the following table creation statement, the KEY partition partition key is NULL, and no primary key is defined, but it contains a unique key. When building a partition expression, a unique key is used as the partition key:
CREATE TABLE t1 (
col1 INT NOT NULL,
col2 DATE NOT NULL,
col3 INT NOT NULL,
col4 INT NOT NULL,
UNIQUE KEY (col1, col2)
)
PARTITION BY KEY()
PARTITIONS 4;
Note
Other partition rules are basically consistent with MySQL.
3. Description of MatrixOne partition expressions¶
When a DDL statement builds a partition table, a partition expression is generated for each partition definition, which can be used to calculate the partition to which the data belongs.
During the planning construction phase, the partition information data structure in the DDL statement is plan.PartitionInfo:
type PartitionInfo struct {
Type PartitionType
Expr *Expr
PartitionExpression *Expr
Columns []*Expr
PartitionColumns []string
PartitionNum uint64
Partitions []*PartitionItem
Algorithm int64
IsSubPartition bool
PartitionMsg string
}
Where PartitionExpression is a partition expression. The partition expression is MatrixOne. The method of converting the partition clause into an expression for processing. The construction method of each partition expression is as follows:
KEY Partitioning¶
The KEY partition will construct a partition expression based on the partition key and the number of partitions. The calculation result of the partition expression is an integer greater than or equal to 0, representing the partition number, and incrementing from zero.
SQL examples are as follows:
CREATE TABLE t1 (
col1 INT NOT NULL,
col2 DATE NOT NULL,
col3 INT NOT NULL,
col4 INT NOT NULL,
PRIMARY KEY (col1, col2)
)
PARTITION BY KEY(col1)
PARTITIONS 4;
HASH Partitioning¶
Similar to KEY partition, the HASH partition will build a partition expression based on the partition function and the number of partitions. The calculation result of the partition expression is an integer greater than or equal to 0, representing the partition number, and incrementing from zero.
SQL examples are as follows:
CREATE TABLE t1 (
col1 INT,
col2 CHAR(5),
col3 DATE
)
PARTITION BY LINEAR HASH( YEAR(col3))
PARTITIONS 6;
RANGE Partitioning¶
RANGE partitioning is a method of dividing table data into different partitions based on the range of column values. This partition type is very suitable for data that can be segmented based on the value range of a particular column.
SQL examples are as follows:
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separate DATE NOT NULL DEFAULT '9999-12-31',
job_code INT NOT NULL,
store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
RANGE COLUMNS partitioning¶
RANGE COLUMNS partition allows the use of a combination of one or more columns as partition keys, each partition defines a range of values corresponding to the combined values of the partition key column. When data is inserted, the partition to which the row belongs is determined based on the values of these columns.
SQL examples are as follows:
CREATE TABLE rc (
a INT NOT NULL,
b INT NOT NULL
)
PARTITION BY RANGE COLUMNS(a,b) (
PARTITION p0 VALUES LESS THAN (10,5) COMMENT = 'Data for LESS THAN (10,5)',
PARTITION p1 VALUES LESS THAN (20,10) COMMENT = 'Data for LESS THAN (20,10)',
PARTITION p2 VALUES LESS THAN (50,MAXVALUE) COMMENT = 'Data for LESS THAN (50,MAXVALUE)',
PARTITION p3 VALUES LESS THAN (65,MAXVALUE) COMMENT = 'Data for LESS THAN (65,MAXVALUE)',
PARTITION p4 VALUES LESS THAN (MAXVALUE,MAXVALUE) COMMENT = 'Data for LESS THAN (MAXVALUE,MAXVALUE)'
);
LIST Partitioning¶
LIST partitions divide data based on discrete values of a single column. Each partition contains a specific list of column values. When data is inserted, rows are assigned to the corresponding partition according to the value of the column.
SQL examples are as follows:
CREATE TABLE client_firms (
id INT,
name VARCHAR(35)
)
PARTITION BY LIST (id) (
PARTITION r0 VALUES IN (1, 5, 9, 13, 17, 21),
PARTITION r1 VALUES IN (2, 6, 10, 14, 18, 22),
PARTITION r2 VALUES IN (3, 7, 11, 15, 19, 23),
PARTITION r3 VALUES IN (4, 8, 12, 16, 20, 24)
);
LIST COLUMNS partitioning¶
LIST COLUMNS partitions are similar to LIST partitions, but allow the use of a combination of one or more columns as partition keys. Partitions are specific lists based on the combination of column values. When inserting rows, their partitions are determined based on the combined values of these columns.
SQL examples are as follows:
CREATE TABLE lc (
a INT NULL,
b INT NULL
)
PARTITION BY LIST COLUMNS(a,b) (
PARTITION p0 VALUES IN( (0,0), (NULL,NULL) ),
PARTITION p1 VALUES IN( (0,1), (0,2) ),
PARTITION p2 VALUES IN( (1,0), (2,0) )
);