MySQL 8.4 Reference Manual  /  ...  /  Maintenance of Partitions

26.3.4 维护分区的部分

可以使用SQL语句来执行多种表和分区维护任务,这些语句是专门为此目的设计的。

对分区表进行维护,可以使用以下语句:CHECK TABLEOPTIMIZE TABLEANALYZE TABLE,和REPAIR TABLE。这些语句对分区表也是支持的。

可以使用一些扩展来ALTER TABLE执行类似操作的直接操作,以下是这些操作的列表:

  • 重建分区。  重建分区,这与删除存储在分区中的所有记录,然后重新插入它们相同。这个可以用于碎片整理目的。

    示例:

    ALTER TABLE t1 REBUILD PARTITION p0, p1;
  • 优化分区。  如果你从一个分区中删除了大量行,或者如果你对一个包含变长列(即VARCHARBLOB,或TEXT列的分区变长表)进行了许多更改,你可以使用ALTER TABLE ... OPTIMIZE PARTITION来回收未使用的空间并对分区数据文件进行碎片整理。

    示例:

    ALTER TABLE t1 OPTIMIZE PARTITION p0, p1;

    在给定分区上使用OPTIMIZE PARTITION等同于对该分区运行CHECK PARTITIONANALYZE PARTITIONREPAIR PARTITION

    一些MySQL存储引擎,包括InnoDB,不支持按分区优化;在这种情况下,ALTER TABLE ... OPTIMIZE PARTITION分析并重建整个表,并发出适当的警告。(Bug #11751825,Bug #42822)使用ALTER TABLE ... REBUILD PARTITIONALTER TABLE ... ANALYZE PARTITION代替,以避免这个问题。

  • 分析分区。  这读取并存储分区的键分布。

    示例:

    ALTER TABLE t1 ANALYZE PARTITION p3;
  • 修复分区。  修复损坏的分区。

    示例:

    ALTER TABLE t1 REPAIR PARTITION p0,p1;

    通常,REPAIR PARTITION在分区中出现重复键错误时失败。你可以使用ALTER IGNORE TABLE选项,在这种情况下,所有无法移动的行(因为存在重复键)将从分区中移除。(Bug #16900947)

  • 检查分区。  你可以像对非分区表使用CHECK TABLE一样检查分区。

    示例:

    ALTER TABLE trb3 CHECK PARTITION p1;

    这个语句告诉你表t1的分区p1中的数据或索引是否损坏。如果这是真的,你可以使用ALTER TABLE ... REPAIR PARTITION来修复分区。

    通常,CHECK PARTITION在分区中出现重复键错误时失败。你可以使用ALTER IGNORE TABLE选项,在这种情况下,语句返回分区中每一行的内容,其中存在重复键违规。只有分区表达式列的值被报告。(Bug #16900947)

列表中的每个语句也支持在分区名称列表之后使用关键字ALL。使用ALL会导致语句对表中的所有分区进行操作。

您还可以使用 ALTER TABLE ... TRUNCATE PARTITION 来截断分区。这条语句可以用来删除表中一个或多个分区中的所有行,就像 TRUNCATE TABLE 一样删除了表中的所有行。

ALTER TABLE ... TRUNCATE PARTITION ALL 则截断了表中的所有分区。