文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  ALTER TABLE 分区操作

15.1.9.1 ALTER TABLE 分区操作

ALTER TABLE 的分区相关子句可用于分区表,以进行重新分区、添加、删除、丢弃、导入、合并和拆分分区,以及执行分区维护。

  • 只需在分区表上使用带有 partition_options 子句的 ALTER TABLE,即可根据 partition_options 定义的分区方案重新分区表。此子句始终以 PARTITION BY 开头,并遵循与 CREATE TABLEpartition_options 子句相同的语法和其他规则(有关更多详细信息,请参阅 第 15.1.20 节“CREATE TABLE 语句”),并且还可用于对尚未分区的现有表进行分区。例如,请考虑此处所示的(未分区)表的定义

    CREATE TABLE t1 (
        id INT,
        year_col INT
    );

    可以使用此语句将此表通过 HASH 分区,使用 id 列作为分区键,分为 8 个分区

    ALTER TABLE t1
        PARTITION BY HASH(id)
        PARTITIONS 8;

    MySQL 支持在使用 [SUB]PARTITION BY [LINEAR] KEY 时使用 ALGORITHM 选项。ALGORITHM=1 使服务器在计算行在分区中的位置时使用与 MySQL 5.1 相同的键哈希函数;ALGORITHM=2 意味着服务器使用 MySQL 5.5 及更高版本中默认实现和使用的键哈希函数来处理新的 KEY 分区表。(使用 MySQL 5.5 及更高版本中使用的键哈希函数创建的分区表不能被 MySQL 5.1 服务器使用。)不指定该选项与使用 ALGORITHM=2 具有相同的效果。此选项主要用于在 MySQL 5.1 和更高版本的 MySQL 版本之间升级或降级 [LINEAR] KEY 分区表,或者用于在 MySQL 5.5 或更高版本的服务器上创建按 KEYLINEAR KEY 分区的表,以便在 MySQL 5.1 服务器上使用。

    使用 ALTER TABLE ... PARTITION BY 语句生成的结果表必须遵循与使用 CREATE TABLE ... PARTITION BY 创建的表相同的规则。这包括管理表可能具有的任何唯一键(包括任何主键)与分区表达式中使用的列之间的关系的规则,如 第 26.6.1 节“分区键、主键和唯一键” 中所述。CREATE TABLE ... PARTITION BY 用于指定分区数量的规则也适用于 ALTER TABLE ... PARTITION BY

    ALTER TABLE ADD PARTITIONpartition_definition 子句支持与 CREATE TABLE 语句中同名子句相同的选项。(有关语法和说明,请参见 第 15.1.20 节“CREATE TABLE 语句”。)假设您创建了如下所示的分区表

    CREATE TABLE t1 (
        id INT,
        year_col INT
    )
    PARTITION BY RANGE (year_col) (
        PARTITION p0 VALUES LESS THAN (1991),
        PARTITION p1 VALUES LESS THAN (1995),
        PARTITION p2 VALUES LESS THAN (1999)
    );

    您可以向此表添加一个新的分区 p3,用于存储小于 2002 的值,如下所示

    ALTER TABLE t1 ADD PARTITION (PARTITION p3 VALUES LESS THAN (2002));

    DROP PARTITION 可用于删除一个或多个 RANGELIST 分区。此语句不能与 HASHKEY 分区一起使用;请改用 COALESCE PARTITION(请参见本节后面的内容)。存储在 partition_names 列表中命名的已删除分区中的任何数据都将被丢弃。例如,给定先前定义的表 t1,您可以删除名为 p0p1 的分区,如下所示

    ALTER TABLE t1 DROP PARTITION p0, p1;
    注意

    DROP PARTITION 不适用于使用 NDB 存储引擎的表。请参见 第 26.3.1 节“RANGE 和 LIST 分区的管理” 以及 第 25.2.7 节“NDB 集群的已知限制”

    ADD PARTITIONDROP PARTITION 当前不支持 IF [NOT] EXISTS

    DISCARD PARTITION ... TABLESPACEIMPORT PARTITION ... TABLESPACE 选项将 可传输表空间 功能扩展到各个 InnoDB 表分区。每个 InnoDB 表分区都有自己的表空间文件(.ibd 文件)。可传输表空间 功能可以轻松地将表空间从正在运行的 MySQL 服务器实例复制到另一个正在运行的实例,或者在同一个实例上执行还原。这两个选项都采用一个或多个分区名称的逗号分隔列表。例如

    ALTER TABLE t1 DISCARD PARTITION p2, p3 TABLESPACE;
    ALTER TABLE t1 IMPORT PARTITION p2, p3 TABLESPACE;

    在子分区表上运行 DISCARD PARTITION ... TABLESPACEIMPORT PARTITION ... TABLESPACE 时,允许使用分区名称和子分区名称。当指定分区名称时,将包含该分区的子分区。

    可传输表空间 功能还支持复制或还原已分区 InnoDB 表。有关更多信息,请参见 第 17.6.1.3 节“导入 InnoDB 表”

    支持对分区表进行重命名。您可以使用 ALTER TABLE ... REORGANIZE PARTITION 间接重命名单个分区;但是,此操作会复制分区的数据。

    要从选定的分区中删除行,请使用 TRUNCATE PARTITION 选项。此选项采用一个或多个以逗号分隔的分区名称的列表。请考虑由以下语句创建的表 t1

    CREATE TABLE t1 (
        id INT,
        year_col INT
    )
    PARTITION BY RANGE (year_col) (
        PARTITION p0 VALUES LESS THAN (1991),
        PARTITION p1 VALUES LESS THAN (1995),
        PARTITION p2 VALUES LESS THAN (1999),
        PARTITION p3 VALUES LESS THAN (2003),
        PARTITION p4 VALUES LESS THAN (2007)
    );

    要从分区 p0 中删除所有行,请使用以下语句

    ALTER TABLE t1 TRUNCATE PARTITION p0;

    刚刚显示的语句与以下 DELETE 语句具有相同的效果

    DELETE FROM t1 WHERE year_col < 1991;

    截断多个分区时,这些分区不必是连续的:这可以大大简化对分区表的删除操作,否则如果使用 DELETE 语句执行,则需要非常复杂的 WHERE 条件。例如,以下语句从分区 p1p3 中删除所有行

    ALTER TABLE t1 TRUNCATE PARTITION p1, p3;

    等效的 DELETE 语句如下所示

    DELETE FROM t1 WHERE
        (year_col >= 1991 AND year_col < 1995)
        OR
        (year_col >= 2003 AND year_col < 2007);

    如果在分区名称列表中使用 ALL 关键字代替分区名称列表,则该语句将作用于所有表分区。

    TRUNCATE PARTITION 仅删除行;它不会更改表本身或其任何分区的定义。

    要验证行是否已删除,请使用如下查询检查 INFORMATION_SCHEMA.PARTITIONS

    SELECT PARTITION_NAME, TABLE_ROWS
        FROM INFORMATION_SCHEMA.PARTITIONS
        WHERE TABLE_NAME = 't1';

    COALESCE PARTITION 可以与按 HASHKEY 分区的表一起使用,以将分区数量减少 number 个。假设您创建了表 t2,如下所示

    CREATE TABLE t2 (
        name VARCHAR (30),
        started DATE
    )
    PARTITION BY HASH( YEAR(started) )
    PARTITIONS 6;

    要将 t2 使用的分区数量从 6 个减少到 4 个,请使用以下语句

    ALTER TABLE t2 COALESCE PARTITION 2;

    最后 number 个分区中包含的数据将合并到剩余的分区中。在这种情况下,分区 4 和 5 将合并到前 4 个分区(编号为 0、1、2 和 3 的分区)中。

    要更改分区表使用的一些但并非所有分区,可以使用 REORGANIZE PARTITION。此语句可以通过多种方式使用

    • 将一组分区合并到一个分区中。这是通过在 partition_names 列表中命名多个分区并为 partition_definition 提供单个定义来完成的。

    • 将现有分区拆分为多个分区。通过为 partition_names 命名单个分区并提供多个 partition_definitions 来实现这一点。

    • 更改使用 VALUES LESS THAN 定义的分区子集的范围或使用 VALUES IN 定义的分区子集的值列表。

    注意

    对于尚未显式命名的分区,MySQL 会自动提供默认名称 p0p1p2,依此类推。子分区也是如此。

    有关 ALTER TABLE ... REORGANIZE PARTITION 语句的更多详细信息和示例,请参见 第 26.3.1 节“RANGE 和 LIST 分区的管理”

  • 要将表分区或子分区与表交换,请使用 ALTER TABLE ... EXCHANGE PARTITION 语句,即将分区或子分区中的任何现有行移动到非分区表,并将非分区表中的任何现有行移动到表分区或子分区。

    一旦使用 ALGORITHM=INSTANT 将一列或多列添加到分区表后,就不能再与该表交换分区。

    有关用法信息和示例,请参见 第 26.3.3 节“与表交换分区和子分区”

  • 一些选项提供了分区维护和修复功能,类似于 CHECK TABLEREPAIR TABLE 等语句为非分区表实现的功能(这些语句也支持分区表;有关更多信息,请参见 第 15.7.3 节“表维护语句”)。这些选项包括 ANALYZE PARTITIONCHECK PARTITIONOPTIMIZE PARTITIONREBUILD PARTITIONREPAIR PARTITION。这些选项中的每一个都采用一个 partition_names 子句,该子句由一个或多个分区名称组成,并以逗号分隔。这些分区必须已存在于目标表中。您也可以使用 ALL 关键字代替 partition_names,在这种情况下,该语句将作用于所有表分区。有关更多信息和示例,请参见 第 26.3.4 节“分区的维护”

    InnoDB 当前不支持每个分区的优化;ALTER TABLE ... OPTIMIZE PARTITION 会导致重建和分析整个表,并发出相应的警告。(错误 #11751825,错误 #42822)要解决此问题,请改用 ALTER TABLE ... REBUILD PARTITIONALTER TABLE ... ANALYZE PARTITION

    未分区的表不支持 ANALYZE PARTITIONCHECK PARTITIONOPTIMIZE PARTITIONREPAIR PARTITION 选项。

  • REMOVE PARTITIONING 使您能够删除表的分区,而不会影响表或其数据。此选项可以与其他 ALTER TABLE 选项组合使用,例如用于添加、删除或重命名列或索引的选项。

  • ENGINE 选项与 ALTER TABLE 一起使用可以更改表使用的存储引擎,而不会影响分区。目标存储引擎必须提供自己的分区处理程序。只有 InnoDBNDB 存储引擎具有原生分区处理程序。

ALTER TABLE 语句可以在其他更改规范之外包含 PARTITION BYREMOVE PARTITIONING 子句,但 PARTITION BYREMOVE PARTITIONING 子句必须在任何其他规范之后指定。

ADD PARTITIONDROP PARTITIONCOALESCE PARTITIONREORGANIZE PARTITIONANALYZE PARTITIONCHECK PARTITIONREPAIR PARTITION 选项不能与其他 alter 规范组合在单个 ALTER TABLE 语句中,因为上面列出的选项仅作用于单个分区。有关更多信息,请参阅第 15.1.9.1 节 “ALTER TABLE 分区操作”

在给定的 ALTER TABLE 语句中,下列每个选项只能使用一次:PARTITION BYADD PARTITIONDROP PARTITIONTRUNCATE PARTITIONEXCHANGE PARTITIONREORGANIZE PARTITIONCOALESCE PARTITIONANALYZE PARTITIONCHECK PARTITIONOPTIMIZE PARTITIONREBUILD PARTITIONREMOVE PARTITIONING

例如,以下两条语句无效

ALTER TABLE t1 ANALYZE PARTITION p1, ANALYZE PARTITION p2;

ALTER TABLE t1 ANALYZE PARTITION p1, CHECK PARTITION p2;

在第一种情况下,您可以使用包含单个 ANALYZE PARTITION 选项的单个语句同时分析表 t1 的分区 p1p2,该选项列出了要分析的两个分区,如下所示

ALTER TABLE t1 ANALYZE PARTITION p1, p2;

在第二种情况下,无法同时对同一表的不同分区执行 ANALYZECHECK 操作。而必须发出两个单独的语句,如下所示

ALTER TABLE t1 ANALYZE PARTITION p1;
ALTER TABLE t1 CHECK PARTITION p2;

目前不支持对子分区进行 REBUILD 操作。明确禁止对子分区使用 REBUILD 关键字,如果使用,会导致 ALTER TABLE 失败并报错。

如果要检查或修复的分区包含任何重复键错误,则 CHECK PARTITION REPAIR PARTITION 操作将失败。

有关这些语句的更多信息,请参阅第 26.3.4 节 “分区的维护”