1.何为子分区?
子分区顾名思义,就是在分区中再创建分区,达到对数据的细腻化操作。
MySQL数据库中允许在RANGE和LIST的分区上再进行HASH分区或KEY分区。
2.实例学习
运行下面语句:
CREATE TABLE ts(
a int,
b date
)
partition by range (year(b))
subpartition by hash(to_days(b))
subpartitions 2(
partition p0 values less than (1990),
partition p1 values less than (2000),
partition p2 values less than maxvalue
);
上面的分区语句首先根据b的年份创建三个分区1990,2000,maxvalue,然后再将这三个分区根据天再分成两个小分区,所以其实总共有6个分区。
如图:
可以看到mysql分别创建了6个物理文件存放这6个分区的数据。
通过上面的语句我们可以看到使用的子分区是默认的命名,我们也可以显式的定义各个子分区的名字:
CREATE TABLE ts(
a int,
b date
)
partition by range ( year(b))
subpartition by hash( to_days(b))(
partition p0 values less than(1990)(
subpartition s0,
subpartition s1
),
partition p1 values less than(2000)(
subpartition s2,
subpartition s3
),
partition p2 values less than maxvalue (
subpartition s4,
subpartition s5
)
);
在使用分区时,注意:
1)每个子分区的数量必须一致
2)如果在一个分区表中的任何分区上使用SUBPARTITION来明确定义任何子分区,那么就必须定义所有的子分区
3)每个SUBPARTITION子句必须包括子分区的一个名字
4)子分区的名字必须是唯一的
3.分区中对NULL的处理
对于MySQL需要记住:
在RANGE分区下,NULL会被放入最左边的分区中
在LIST分区中使用NULL,必须显式地指出在那个分区中放入NULL值,否则数据库会报错。
HASH和KEY分区对NULL的处理方式与RANGE和LIST分区不一样,任何分区函数都将会含有NULL值的记录返回为0,也就是会放在P0分区中。