22.3.4 分区维护

对于 MySQL 5.7 中的分区 table,可以使用旨在用于此目的的 SQL 语句执行许多 table 和分区维护任务。

可以使用语句CHECK TABLEOPTIMIZE TABLEANALYZE TABLEREPAIR TABLE来完成分区 table 的 table 维护,这对于分区 table 是受支持的。

您可以使用多个ALTER TABLEextensions 来直接在一个或多个分区上执行此类型的操作,如下 table 所示:

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

Example:

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

Example:

ALTER TABLE t1 OPTIMIZE PARTITION p0, p1;

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

某些 MySQL 存储引擎(包括InnoDB)不支持按分区优化;在这种情况下,更改 table...优化分区分析并重建整个 table,并发出适当的警告。 (错误#11751825,错误#42822)改用ALTER TABLE ... REBUILD PARTITIONALTER TABLE ... ANALYZE PARTITION来避免此问题。

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

Example:

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

Example:

ALTER TABLE t1 REPAIR PARTITION p0,p1;

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

  • 检查分区. 您可以像对未分区 table 使用CHECK TABLE一样检查分区中的错误。

Example:

ALTER TABLE trb3 CHECK PARTITION p1;

该命令将告诉您 tablet1的分区p1中的数据或索引是否已损坏。在这种情况下,请使用更改 table...修复分区修复分区。

通常,当分区包含重复的键错误时,CHECK PARTITION会失败。在 MySQL 5.7.2 和更高版本中,可以将此选项与更改 table配合使用,在这种情况下,该语句返回分区中每一行的内容,在该行中发现重复的键冲突。仅报告 table 分区 table 达式中各列的值。错误 16900947)

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

分区 table 不支持使用mysqlcheckmyisamchk

在 MySQL 5.7 中,您也可以使用ALTER TABLE ...截断分区截断分区。此语句可用于删除一个或多个分区中的所有行,其方式与TRUNCATE TABLE从 table 中删除所有行的方式几乎相同。

ALTER TABLE ...截断所有分区截断 table 中的所有分区。

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