当您需要访问或修改指定的一级分区或二级分区时,通常语法里需要指定具体的一级分区或二级分区的名称。因此,这里对分区表中一些会自动生成分区名称的规则进行说明。
分区表中涉及到自动生成分区名称的有以下几种情况:
分区表或全局索引表使用HASH或KEY进行分区(包括自动分区表);
分区表使用模板化二级分区进行分区;
哈希分区表被手动执行分区分裂变更。
一级分区命名规则
一级分区会自动生成分区名称的场景主要是使用哈希分区策略(Hash或Key)并仅指定哈希分区数目(包括手动分区表与自动分区表)。
使用哈希策略进行分区,其分区名字的命名规则为:p+分区下标(从1开始计数)。
CREATE TABLE test_tbl_part_name(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(id)
PARTITIONS 4例如,若使用上述语句创建分区表,生成的分区名称为:第1个哈希分区的名称是p1,第2个哈希分区的名称是p2,如此类推。以下是实际验证结果:
CREATE TABLE test_tbl_part_name (
-> id bigint not null auto_increment,
-> primary key(id)
-> )
-> PARTITION BY KEY(id)
-> PARTITIONS 4;
Query OK, 0 rows affected (1.13 sec)
select table_name,partition_name from information_schema.partitions where table_name='test_tbl_part_name';
+--------------------+----------------+
| table_name | partition_name |
+--------------------+----------------+
| test_tbl_part_name | p1 |
| test_tbl_part_name | p2 |
| test_tbl_part_name | p3 |
| test_tbl_part_name | p4 |
+--------------------+----------------+
4 rows in set (0.59 sec)如果用户通过ALTER语句对分区表的特定分区进行一些分裂变更,那么分裂生成的新分区名字的命名规则为:p+当前最大分区下标+1 。示例如下:
alter table test_tbl_part_name split partition p1;
Query OK, 0 rows affected (5.83 sec)
select table_name,partition_name from information_schema.partitions where table_name='test_tbl_part_name';
+--------------------+----------------+
| table_name | partition_name |
+--------------------+----------------+
| test_tbl_part_name | p5 |
| test_tbl_part_name | p6 |
| test_tbl_part_name | p2 |
| test_tbl_part_name | p3 |
| test_tbl_part_name | p4 |
+--------------------+----------------+
5 rows in set (0.18 sec)二级分区命名规则
二级分区有模板化与非模板化两种用法,因此二级分区名称的生成规则比一级分区的稍微复杂一些。
对于模板化二级分区,哈希分区模板的命名规则是:sp+二级分区下标(从1开始计数)。
对于非模板化二级分区,各个一级分区下的哈希分区名字是独立生成的,其命名规则是:sp+二级分区下标(从1开始计数,各个一级分区独立计数)。
对于所有二级分区,其分区实际名字的生成规则是:一级分区名字+二级分区(模板)名字。
例如,使用以下分区定义创建模板化二级分区表:
CREATE TABLE test_tbl_part_name2(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(bid)
PARTITIONS 2
SUBPARTITION BY KEY(id)
SUBPARTITIONS 4这个表的所有二级分区的名称生成过程如下:
自动生成一级分区的哈希分区:p1,p2;
自动生成二级分区模板的哈希分区名,sp1,sp2,sp3,sp4;
最后生成二级分区的实际名字(物理分区名字,一级分区名+二级分区名):
p1sp1,p1sp2,p1sp3,p1sp4
p2sp1,p2sp2,p2sp3,p2sp4
以下是分区信息的查询结果:
CREATE TABLE test_tbl_part_name2(
-> id bigint not null auto_increment,
-> bid int,
-> name varchar(30),
-> birthday datetime not null,
-> primary key(id)
-> )
-> PARTITION BY KEY(bid)
-> PARTITIONS 2
-> SUBPARTITION BY KEY(id)
-> SUBPARTITIONS 4;
Query OK, 0 rows affected (1.40 sec)
select table_name,partition_name,subpartition_name from information_schema.partitions where table_schema='autodb2' and table_name='test_tbl_part_name2';
+---------------------+----------------+-------------------+
| table_name | partition_name | subpartition_name |
+---------------------+----------------+-------------------+
| test_tbl_part_name2 | p1 | p1sp1 |
| test_tbl_part_name2 | p1 | p1sp2 |
| test_tbl_part_name2 | p1 | p1sp3 |
| test_tbl_part_name2 | p1 | p1sp4 |
| test_tbl_part_name2 | p2 | p2sp1 |
| test_tbl_part_name2 | p2 | p2sp2 |
| test_tbl_part_name2 | p2 | p2sp3 |
| test_tbl_part_name2 | p2 | p2sp4 |
+---------------------+----------------+-------------------+
8 rows in set (0.12 sec)



