Creation

A unique index must include all columns in the partitioning function.
RANGE
CREATE TABLE tbl(
a INT
) PARTITION BY RANGE (a) (  -- expression or any data type
PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN (20),
PARTITION p2 VALUES LESS THAN (30),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
CREATE TABLE tbl (
ts TIMESTAMP
) PARTITION BY RANGE (UNIX_TIMESTAMP(ts) ) (
PARTITION p0 VALUES LESS THAN
(UNIX_TIMESTAMP('2013-01-01 00:00:00') ),
PARTITION p1 VALUES LESS THAN
(UNIX_TIMESTAMP('2014-01-01 00:00:00') ),
PARTITION p2 VALUES LESS THAN
(UNIX_TIMESTAMP('2015-01-01 00:00:00') ),
PARTITION p3 VALUES LESS THAN (MAXVALUE)
);


RANGE COLUMN
CREATE TABLE tbl (
d DATE,
s VARCHAR(10)
) PARTITION BY RANGE COLUMNS (s,d) ( -- no expression
PARTITION p0 VALUES LESS THAN ('d','2015-01-01'),
PARTITION p1 VALUES LESS THAN ('f','2015-01-01'),
PARTITION p2 VALUES LESS THAN ('n','2015-01-01'),
PARTITION p3 VALUES LESS THAN (MAXVALUE,
MAXVALUE)
);
SELECT PARTITION_NAME, TABLE ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = ‘tb’;
SELECT (0,25,50)< (20,20,0),  -- 1  
(100,0,0)< (0,10,20);  -- 0


LIST
CREATE TABLE tbl(
a INT
) PARTITION BY LIST (a) (  -- only integer columns allowed
PARTITION odd VALUES IN(1,3,5,7,9),
PARTITION even VALUES IN(0,2,4,6,8)
);


LIST COLUMN
CREATE TABLE tbl(
a VARCHAR(3),
b VARCHAR(3)
) PARTITION BY LIST COLUMNS (a,b) (
PARTITION pt1 VALUES IN(('a','x'),('c','x')),
PARTITION pt2 VALUES IN(('b','y'))
);


HASH
CREATE TABLE tbl(
d1 DATE,
d2 DATE,
UNIQUE(c,d)
) PARTITION BY LINEAR HASH (YEAR(d1)+YEAR(d2)) #integer
PARTITIONS 4;
HASH uses a simple modulo function to map the rows to the partitions.


LINEAR HASH
CREATE TABLE tbl(
d DATE
) PARTITION BY LINEAR HASH (YEAR(d)) # integer
PARTITIONS 6;
To determine the partition which stores a row
1. Find the next power of 2 greater than the partitions total:
v = POWER(2, CEILING(LOG(2, pTotal)))
2. Set N = F(columns) & (v-1)
3. While N>= pTotal
Set v=CEILING(v/2)
Set N=N & (v -1)

For instance, if ‘1998-01-01’ is inserted into tbl, the partition number is given by:
v = POWER(2,CESILING(LOG(2,6))) = 8
N = Year(‘1998-01-01’) & (8-1)
= 1998 & 7
= 6         (>=pTotal)
N’= 6 & (CEILING(8/2)-1)
= 6 & 3
= 2
Linear hashing allows adding, dropping, merging, and splitting of partitions to be much faster. The disadvantage is that data is less likely to be evenly distributed compared to regular hashing.


KEY
CREATE TABLE tbl(
a DATE,
b VARCHAR(10),
PRIMARY KEY (a,b)
) PARTITION BY KEY(a,b)  -- non-integers allowed
PARTITIONS 6;
CREATE TABLE tbl(
a DATE PRIMARY KEY,
b VARCHAR(10)
) PARTITION BY KEY() -- a used
PARTITIONS 6;
This causes MySQL to use its own hashing function, one which is the same for PASSWORD().


LINEAR KEY
CREATE TABLE tbl(
a DATE,
b VARCHAR(10),
PRIMARY KEY (a,b)
) PARTITION BY LINEAR KEY(a,b)  -- non-integers allowed
PARTITIONS 6;


subpartitioning
CREATE TABLE tbl (a INT, b DATE)
PARTITION BY RANGE(YEAR(b))  -- RANGE or LIST
SUBPARTITION BY HASH(TO_DAYS(b))  -- HASH or KEY
SUBPARTITIONS 2 (  -- 2 subpartitions per partition
PARTITION p0 VALUES LESS THAN (2016),
PARTITION p1 VALUES LESS THAN (2018),
PARTITION p2 VALUES LESS THAN MAXVALUE
);
CREATE TABLE tbl(a INT, b DATE)
PARTITION BY RANGE(YEAR(b))
SUBPARTITION BY HASH(TO_DAYS(b)) (
PARTITION p0 VALUES LESS THAN (2016) ( -- explicit
SUBPARTITION s0
DATA DIRECTORY = '/disk0/data'
INDEX DIRECTORY = '/disk0/idx',
SUBPARTITION s1
DATA DIRECTORY = '/disk1/data'
INDEX DIRECTORY = '/disk1/idx'
),
PARTITION p1 VALUES LESS THAN (2018) (
SUBPARTITION s2
DATA DIRECTORY = '/disk2/data'
INDEX DIRECTORY = '/disk2/idx',
SUBPARTITION s3
DATA DIRECTORY = '/disk3/data'
INDEX DIRECTORY = '/disk3/idx'
),
PARTITION p2 VALUES LESS THAN MAXVALUE (
SUBPARTITION s4
DATA DIRECTORY = '/disk4/data'
INDEX DIRECTORY = '/disk4/idx',
SUBPARTITION s5
DATA DIRECTORY = '/disk5/data'
INDEX DIRECTORY = '/disk5/idx'
)
);