文档主页
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 TABLE 的 partition_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 或更高版本的服务器上创建按 KEY 或 LINEAR 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 PARTITION 的 partition_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 可用于删除一个或多个 RANGE 或 LIST 分区。此语句不能与 HASH 或 KEY 分区一起使用;请改用 COALESCE PARTITION(请参见本节后面的内容)。存储在 partition_names 列表中命名的已删除分区中的任何数据都将被丢弃。例如,给定先前定义的表 t1,您可以删除名为 p0 和 p1 的分区,如下所示

    ALTER TABLE t1 DROP PARTITION p0, p1;
    注意

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

    ADD PARTITION 和 DROP PARTITION 当前不支持 IF [NOT] EXISTS。

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

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

    在子分区表上运行 DISCARD PARTITION ... TABLESPACE 和 IMPORT 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 条件。例如,以下语句从分区 p1 和 p3 中删除所有行

    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 可以与按 HASH 或 KEY 分区的表一起使用,以将分区数量减少 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 会自动提供默认名称 p0、p1、p2,依此类推。子分区也是如此。

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

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

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

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

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

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

    未分区的表不支持 ANALYZE PARTITION、CHECK PARTITION、OPTIMIZE PARTITION 和 REPAIR PARTITION 选项。

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

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

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

ADD PARTITION、DROP PARTITION、COALESCE PARTITION、REORGANIZE PARTITION、ANALYZE PARTITION、CHECK PARTITION 和 REPAIR PARTITION 选项不能与其他 alter 规范组合在单个 ALTER TABLE 语句中,因为上面列出的选项仅作用于单个分区。有关更多信息,请参阅第 15.1.9.1 节 “ALTER TABLE 分区操作”。

在给定的 ALTER TABLE 语句中,下列每个选项只能使用一次:PARTITION BY、ADD PARTITION、DROP PARTITION、TRUNCATE PARTITION、EXCHANGE PARTITION、REORGANIZE PARTITION 或 COALESCE PARTITION、ANALYZE PARTITION、CHECK PARTITION、OPTIMIZE PARTITION、REBUILD PARTITION、REMOVE PARTITIONING。

例如,以下两条语句无效

ALTER TABLE t1 ANALYZE PARTITION p1, ANALYZE PARTITION p2;

ALTER TABLE t1 ANALYZE PARTITION p1, CHECK PARTITION p2;

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

ALTER TABLE t1 ANALYZE PARTITION p1, p2;

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

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

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

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

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