• 首页
  • css3教程
  • html5教程
  • jQuery手册
  • vue手册
  • php手册
  • MySQL手册
  • apache手册
  • redis手册
  • 子分区

    子分区(也称为复合分区)是分区表中每个分区的进一步划分。考虑以下CREATE TABLE语句:

    CREATE TABLE ts (id INT, purchased DATE)
        PARTITION BY RANGE( YEAR(purchased) )
        SUBPARTITION BY HASH( TO_DAYS(purchased) )
        SUBPARTITIONS 2 (
            PARTITION p0 VALUES LESS THAN (1990),
            PARTITION p1 VALUES LESS THAN (2000),
            PARTITION p2 VALUES LESS THAN MAXVALUE
        );
    

    ts有3个RANGE分区。这些分区中的每个分区p0p1p2进一步分为2个子分区。实际上,整个表分为多个3 * 2 = 6分区。但是,由于该PARTITION BY RANGE子句的作用,其中的前2个仅将值小于1990的记录存储在该purchased列中。

    可以对通过RANGE或进行分区的表进行子分区LIST。子分区可以使用HASHKEY分区。这也称为复合分区。

    注意

    SUBPARTITION BY HASHSUBPARTITION BY KEY一般遵循相同的语法规则PARTITION BY HASHPARTITION BY KEY分别。唯一的例外是SUBPARTITION BY KEY(不同于PARTITION BY KEY)当前不支持默认列,因此即使表具有显式主键,也必须指定用于此目的的列。这是我们正在努力解决的已知问题;有关更多信息和示例,请参阅子分区问题。

    也可以使用SUBPARTITION子句明确定义子分区,以指定各个子分区的选项。例如,ts如上例所示,创建相同表的更详细的方式是:

    CREATE TABLE ts (id INT, purchased DATE)
        PARTITION BY RANGE( YEAR(purchased) )
        SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
            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
            )
        );
    

    这里列出了一些语法上的注意事项:

    • 每个分区必须具有相同数量的子分区。
    • 如果SUBPARTITION在分区表的任何分区上使用显式定义任何子分区,则必须全部定义它们。换句话说,以下语句将失败:

      CREATE TABLE ts (id INT, purchased DATE)
          PARTITION BY RANGE( YEAR(purchased) )
          SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
              PARTITION p0 VALUES LESS THAN (1990) (
                  SUBPARTITION s0,
                  SUBPARTITION s1
              ),
              PARTITION p1 VALUES LESS THAN (2000),
              PARTITION p2 VALUES LESS THAN MAXVALUE (
                  SUBPARTITION s2,
                  SUBPARTITION s3
              )
          );
      

      即使使用此语句,它仍然会失败SUBPARTITIONS 2

    • 每个SUBPARTITION子句必须(至少)包括子分区的名称。否则,您可以为子分区设置任何所需的选项,或允许其采用该选项的默认设置。
    • 子分区名称在整个表中必须唯一。例如,以下CREATE TABLE语句有效:

      CREATE TABLE ts (id INT, purchased DATE)
          PARTITION BY RANGE( YEAR(purchased) )
          SUBPARTITION BY HASH( TO_DAYS(purchased) ) (
              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
              )
      );