tencent cloud

文档反馈

二级分区

最后更新时间:2024-10-09 10:33:10

    功能介绍

    在数据库中,分区是一种可以将表或索引数据分成多个逻辑部分的技术,可以提高查询效率、减少维护成本等。而二级分区则可以更加细粒度地对数据进行划分,如在一个分区内再次划分出多个子分区,可以提高数据的管理和查询效率。TDSQL-C MySQL 版支持创建 range 或 list 类型的二级分区。

    支持版本

    内核版本 TXSQL 8.0 3.1.15及以上。

    适用场景

    如需更加细粒度地对数据进行管理和查询,可以使用二级分区来提高查询的效率,如对大表进行分区。

    注意事项

    新增模板语法 SUBPARTITION TEMPLATE,因此每个子分区的定义必定是一致的。
    每个子分区的名字是:一级分区名 $$ 模板二级分区名。
    二级分区不支持 column_list。
    truncate … with global index 暂时不支持 truncate 所有的分区,如果要 truncate 所有的分区,可以执行 truncate table。
    包含全局索引的分区表,在 truncate partition 时跟官方保持一致,均不是 online ddl,但是包含全局索引的分区在 truncate partition 时需要维护全局索引,运行时间更长。建议使用 delete 的方式替代 truncate。
    在模板二级分区名中不能存在 $$ 字符。
    drop partition 需要重建全局索引,推荐多个 drop partition 合并成一个语句执行,减少维护全局索引的代价。
    不推荐使用 truncate partition 操作,会阻塞 DML。

    使用说明

    1. 创建包含二级分区的表。
    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    (create_definition,...)
    [table_options]
    [partition_options]
    
    partition_options:
    PARTITION BY
    { [LINEAR] HASH(expr)
    | [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list)
    | RANGE{(expr) | COLUMNS(column_list)}
    | LIST{(expr) | COLUMNS(column_list)} }
    [PARTITIONS num]
    [SUBPARTITION BY
    { [LINEAR] HASH(expr)
    | [LINEAR] KEY [ALGORITHM={1 | 2}] (column_list) }
    [SUBPARTITIONS num]
    ]
    [SUBPARTITION BY
    { RANGE{(expr)} -- range二级分区模板
    | LIST{(expr)} -- list二级分区模板
    SUBPARTITION TEMPLATE [(subpartition_definition [, subpartition_definition] ...)]} -- 子分区模板
    ]
    [(partition_definition [, partition_definition] ...)]
    
    subpartition_definition:
    SUBPARTITION logical_name
    [VALUES
    { LESS THAN {(expr | value_list) | MAXVALUE} --Range子分区范围
    | IN (value_list)}] --List子分区范围
    [[STORAGE] ENGINE [=] engine_name]
    [COMMENT [=] 'string' ]
    [DATA DIRECTORY [=] 'data_dir']
    [INDEX DIRECTORY [=] 'index_dir']
    [MAX_ROWS [=] max_number_of_rows]
    [MIN_ROWS [=] min_number_of_rows]
    [TABLESPACE [=] tablespace_name]
    例如:
    CREATE TABLE `t1` (
    `id` int DEFAULT NULL,
    `purchased` int DEFAULT NULL,
    KEY `idx` (`id`,`purchased`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    /*!50100 PARTITION BY RANGE (`id`)
    SUBPARTITION BY RANGE (`purchased`)
    SUBPARTITION TEMPLATE
    (SUBPARTITION s0 VALUES LESS THAN (10) ENGINE = InnoDB,
    SUBPARTITION s1 VALUES LESS THAN (20) ENGINE = InnoDB)
    (PARTITION p0 VALUES LESS THAN (10) ENGINE = InnoDB,
    PARTITION p1 VALUES LESS THAN (20) ENGINE = InnoDB,
    PARTITION p2 VALUES LESS THAN (30) ENGINE = InnoDB) */;
    2. ALTER TABLE 语法。
    -- 二级分区的支持
    ALTER TABLE tbl_name
    [alter_option [, alter_option] ...]
    [partition_options] [subpartition_options] -- 新增subpartition_options
    
    subpartition_options:
    subpartition_option [subpartition_option] ...
    
    subpartition_options: {
    MODIFY PARTITION partition_name TRUNCATE SUBPARTITION TEMPLATE subpartition_template_name; -- truncate 分区partition_name中模版名为subpartition_template_name的分区
    | TRUNCATE SUBPARTITION TEMPLATE subpartition_template_name -- truncate subpartition_template_name的二级分区
    | ADD SUBPARTITION TEMPLATE subpartition_definitions -- 新增subpartition_definitions模版
    | DROP SUBPARTITION TEMPLATE subpartition_template_name -- drop subpartition_template_name的二级分区
    }
    
    -- 一级分区DDL
    ALTER TABLE t1 TRUNCATE p0 WITH GLOBAL INDEX; -- truncate p1分区(若存在子分区,则truncate下面所有子分区)
    例如:
    -- 二级分区 DDL
    ALTER TABLE t1 MODIFY PARTITION p0 TRUNCATE SUBPARTITION TEMPLATE s1; -- truncate 二级分区p0_s1(一级分区p0,二级分区模板名s1)
    ALTER TABLE t1 TRUNCATE SUBPARTITION TEMPLATE s1; -- 所有分区后缀为_s1的子分区都将被truncate
    ALTER TABLE t1 ADD SUBPARTITION TEMPLATE (SUBPARTITION s2 values in (1,2,3,4)); -- 所有分区将添加后缀为_s2的的子分区
    ALTER TABLE t1 DROP SUBPARTITION TEMPLATE s2; -- 所有分区将删除后缀为_s2的子分区;
    
    -- 一级分区 DDL
    ALTER TABLE t1 ADD PARTITION (PARTITION p2 VALUES LESS THAN (20)); -- 添加分区,若t1是二级分区表,这里将默认使用模板来生成子分区
    ALTER TABLE t1 DROP PARTITION p1;
    ALTER TABLE t1 TRUNCATE p0 WITH GLOBAL INDEX; -- truncate p1分区(若存在子分区,则truncate下面所有子分区)
    3. 支持新的时间函数。
    tdsql_year,tdsql_month,tdsql_day,将时间转为 YYYY,YYYYMM,YYYYMMDD 的格式,支持的类型包含 DATE/DATETIME/TINYINT/SMALLINT/MEDIUMINT/BIGINT/CHAR/VARCHAR/VARBINARY/timestamp/binary。
    当 tdsql_year,tdsql_month,tdsql_day 作为分区键中的函数时,不支持 binary、timestamp 类型。
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持