本文介绍了一级和二级分区的命名规则。
当您需要访问或修改指定的一级分区或二级分区时,通常语法里需要指定具体的一级分区或二级分区的名字。
因此,这里对分区表中一些会自动生成分区名的规则进行说明。
分区表中涉及到自动生成分区名字的有以下几种情况:
分区表或全局索引表使用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
以下是分区信息的查询结果:
mysql> 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)
mysql> 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)