MySQL 8.4 参考手册  /  ...  /  分区的维护

26.3.4 分区的维护

可以使用用于此类目的的 SQL 语句对分区表执行许多表和分区维护任务。

可以使用以下语句完成分区表的表维护:CHECK TABLEOPTIMIZE TABLEANALYZE TABLEREPAIR TABLE,这些语句都支持分区表。

您可以使用 ALTER TABLE 的许多扩展来直接对一个或多个分区执行此类操作,如下列表所示:

  • 重建分区。  重建分区;这与删除存储在分区中的所有记录,然后重新插入它们具有相同的效果。这对于碎片整理很有用。

    示例

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

    示例

    ALTER TABLE t1 OPTIMIZE PARTITION p0, p1;

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

    某些 MySQL 存储引擎(包括 InnoDB)不支持按分区优化;在这些情况下,ALTER TABLE ... OPTIMIZE PARTITION 会分析并重建整个表,并发出相应的警告。(错误 #11751825,错误 #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 与此选项一起使用,在这种情况下,由于存在重复键而无法移动的所有行都将从分区中删除(错误 #16900947)。

  • 检查分区。  您可以检查分区是否存在错误,就像对非分区表使用 CHECK TABLE 一样。

    示例

    ALTER TABLE trb3 CHECK PARTITION p1;

    此语句告诉您表 t1 的分区 p1 中的数据或索引是否已损坏。如果是这种情况,请使用 ALTER TABLE ... REPAIR PARTITION 修复分区。

    通常,当分区包含重复键错误时,CHECK PARTITION 将失败。您可以将 ALTER IGNORE TABLE 与此选项一起使用,在这种情况下,该语句将返回分区中找到重复键冲突的每一行的内容。仅报告表的分区表达式中列的值。(错误 #16900947)

上面列表中的每个语句还支持关键字 ALL 来代替分区名称列表。使用 ALL 会导致该语句对表中的所有分区进行操作。

您还可以使用 ALTER TABLE ... TRUNCATE PARTITION 截断分区。此语句可用于从一个或多个分区中删除所有行,其方式与 TRUNCATE TABLE 从表中删除所有行的方式大致相同。

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