分区命名规则

本文介绍了一级和二级分区的命名规则。

当您需要访问或修改指定的一级分区或二级分区时,通常语法里需要指定具体的一级分区或二级分区的名字。

因此,这里对分区表中一些会自动生成分区名的规则进行说明。

分区表中涉及到自动生成分区名字的有以下几种情况:

  • 分区表或全局索引表使用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

那么,这个表的所有二级分区的名字生成过程过如下:

  1. 自动生成一级分区的哈希分区:p1,p2;

  2. 自动生成二级分区模板的哈希分区名,sp1,sp2,sp3,sp4;

  3. 最后生成二级分区的实际名字(物理分区名字,一级分区名+二级分区名):

    • 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)