### 24.3.4 分区维护

[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

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

可以使用语句完成分区表的表维护[`检查表`](check-table.html),[`优化表`](optimize-table.html),[`分析表`](analyze-table.html)， 和[`维修台`](repair-table.html), 分区表支持。

您可以使用许多扩展程序来[`更改表`](alter-table-partition-operations.html)用于直接在一个或多个分区上执行此类操作，如下表所述：

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

    例子：

    ```
    ALTER TABLE t1 REBUILD PARTITION p0, p1;
    ```

-   **优化分区。**如果您从分区中删除了大量行，或者您对具有可变长度行的分区表进行了许多更改（即[`VARCHAR`](char.html),[`斑点`](blob.html)， 要么[`文本`](blob.html)列），您可以使用[`ALTER TABLE ...优化分区`](alter-table-partition-operations.html)回收任何未使用的空间并对分区数据文件进行碎片整理。

    例子：

    ```
    ALTER TABLE t1 OPTIMIZE PARTITION p0, p1;
    ```

    使用`优化分区`在给定的分区上相当于运行`检查分区`,`分析分区`， 和`修复分区`在那个分区上。

    一些 MySQL 存储引擎，包括[`InnoDB`](innodb-storage-engine.html), 不支持按分区优化；在这些情况下，[`ALTER TABLE ...优化分区`](alter-table-partition-operations.html)分析和重建整个表，并导致发出适当的警告。（错误 #11751825、错误 #42822）使用`ALTER TABLE ...重建分区`和`ALTER TABLE ...分析分区`相反，为了避免这个问题。

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

    例子：

    ```
    ALTER TABLE t1 ANALYZE PARTITION p3;
    ```

-   **修复分区。**这会修复损坏的分区。

    例子：

    ```
    ALTER TABLE t1 REPAIR PARTITION p0,p1;
    ```

    一般，`修复分区`当分区包含重复键错误时失败。您可以使用[`更改忽略表`](alter-table-partition-operations.html)使用此选项，在这种情况下，由于存在重复键而无法移动的所有行都将从分区中删除（错误 #16900947）。

-   **检查分区。**您可以使用与使用相同的方式检查分区是否有错误`检查表`与非分区表。

    例子：

    ```
    ALTER TABLE trb3 CHECK PARTITION p1;
    ```

    该语句告诉您分区中的数据或索引是否`p1`表的`t1`已损坏。如果是这种情况，请使用[`ALTER TABLE ...修复分区`](alter-table-partition-operations.html)修复分区。

    一般，`检查分区`当分区包含重复键错误时失败。您可以使用[`更改忽略表`](alter-table-partition-operations.html)使用此选项，在这种情况下，语句将返回分区中发现重复键违规的每一行的内容。仅报告表的分区表达式中列的值。（错误 #16900947）

    刚刚显示的列表中的每个语句也支持关键字`全部`代替分区名称列表。使用`全部`使语句作用于表中的所有分区。

    您还可以使用截断分区[`ALTER TABLE ...截断分区`](alter-table.html).此语句可用于从一个或多个分区中删除所有行，其方式与[`截断表`](truncate-table.html)从表中删除所有行。

[`ALTER TABLE ... 全部截断分区`](alter-table.html)截断表中的所有分区。
