当MySQL表数据量较大时,通过 DELETE
语句清理数据并不会直接释放磁盘空间,仅会将数据库记录或数据页标记为可重用。若需要真正回收表空间并减少磁盘占用,可通过OPTIMIZE TABLE
实现。
前提条件
仅InnoDB和MyISAM引擎支持
OPTIMIZE TABLE
语句。实例剩余磁盘空间必须大于等于需释放表的空间。
注意事项
必须先删除大量数据:如果未先通过
DELETE
删除大量数据,直接执行OPTIMIZE TABLE
将无法有效降低表空间使用率。磁盘空间占用的短暂增加:执行
OPTIMIZE TABLE
时,MySQL会创建一个临时表来存储重组后的数据,这会导致磁盘空间在短时间内增加。操作完成后,临时表会被删除,磁盘空间占用会恢复正常。性能影响与高峰期风险:在RDS MySQL 5.7和8.0 中,
OPTIMIZE TABLE
使用Online DDL方式执行,支持并发DML操作。然而,对大表执行该操作可能引发突发的IO和Buffer资源占用,存在锁表或资源抢占风险,业务高峰期还可能导致实例不可用或监控中断。因此,建议选择业务低峰期执行以避免对正常业务造成影响。
通过命令行操作
使用
DELETE
语句清理不需要的数据,根据业务实际情况删除即可。执行
OPTIMIZE TABLE
命令,释放表空间。OPTIMIZE TABLE <$Database1>.<Table1>,<$Database2>.<Table2>;
说明<$Database1>与<$Database2>为数据库名,<Table1>与<Table2>为表名。
在InnoDB引擎中执行
OPTIMIZE TABLE
语句时,会出现以下提示信息,该信息是正常执行返回的结果,您可忽略信息,确认返回“ok”即可。详情请参见OPTIMIZE TABLE Statement。Table does not support optimize, doing recreate + analyze instead
通过DMS操作
在左侧选择目标实例的实例ID,然后双击目标库,右键单击任意表名,然后选择批量操作表。
勾选需要释放空间的表名,然后选择
。在弹出的对话框中确认变更信息正确,然后单击确认即可。