MySQL 8.0 参考手册  / 第24章分区  / 24.3 分区管理  /  22.3.4 分区维护

22.3.4 分区维护

在 MySQL 5.7 的分区表上,可以使用专用于此类目的的 SQL 语句来执行许多表和分区维护任务。

分区表的表维护可以使用分区表支持的语句CHECK TABLEOPTIMIZE TABLEANALYZE TABLE和 来完成REPAIR TABLE

您可以使用许多扩展来 ALTER TABLE直接在一个或多个分区上执行这种类型的操作,如下表所述:

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

    例子:

    ALTER TABLE t1 REBUILD PARTITION p0, p1;
  • 优化分区。  如果您从分区中删除了大量行,或者如果您对具有可变长度行(即具有 、 或 列)的分区表进行了多次更改,则VARCHAR可以 BLOB使用 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 PARTITIONandALTER TABLE ... ANALYZE PARTITION来避免这个问题。

  • 分析分区。  这会读取并存储分区的密钥分布。

    例子:

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

    例子:

    ALTER TABLE t1 REPAIR PARTITION p0,p1;

    通常,REPAIR PARTITION当分区包含重复键错误时失败。在 MySQL 5.7.2 及更高版本中,您可以使用 ALTER IGNORE TABLE此选项,在这种情况下,由于存在重复键而无法移动的所有行都将从分区中删除(错误#16900947)。

  • 检查分区。  您可以使用CHECK TABLE与非分区表相同的方式来检查分区是否有错误。

    例子:

    ALTER TABLE trb3 CHECK PARTITION p1;

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

    通常,CHECK PARTITION当分区包含重复键错误时失败。在 MySQL 5.7.2 及更高版本中,您可以使用 ALTER IGNORE TABLE此选项,在这种情况下,该语句将返回发现重复键违规的分区中每一行的内容。仅报告表的分区表达式中列的值。(漏洞 #16900947)

刚刚显示的列表中的每个语句还支持关键字ALL代替分区名称列表。UsingALL导致该语句作用于表中的所有分区。

分区表不支持 使用mysqlcheckmyisamchk 。

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

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

在 MySQL 5.7.2 之前,不允许对子分区执行ANALYZECHECKOPTIMIZEREBUILDREPAIRTRUNCATE操作(错误#14028340,错误#65184)。