我在其中一张表上完成了一些维护任务,现在它有 1GB 的开销。
由于表操作运行了几个小时(删除 40% 的记录,花了 4 个小时)我不想用 OPTIMIZE table 命令锁定数据库几个小时,所以我正在寻找如何处理这种开销并以最佳方式删除的替代方法方法。
表本身是 3GB,有 204 705 条记录。
我在其中一张表上完成了一些维护任务,现在它有 1GB 的开销。
由于表操作运行了几个小时(删除 40% 的记录,花了 4 个小时)我不想用 OPTIMIZE table 命令锁定数据库几个小时,所以我正在寻找如何处理这种开销并以最佳方式删除的替代方法方法。
表本身是 3GB,有 204 705 条记录。
假设您的表上没有触发器,完成在线 OPTIMIZE 的一种简单方法是使用pt-online-schema-change重建表。既然您说这是一个 MyISAM 表,您只需将引擎设置为 MyISAM 即可完成重建而无需更改任何内容:
pt-online-schema-change --alter "ENGINE=MyISAM" D=your_schema,t=your_table
我能够通过执行以下操作的 6 分钟过程来解决此问题:
CREATE TABLE table_reduced LIKE table;
ALTER TABLE table_reduced DISABLE KEYS;
insert into table_reduced
SELECT
*
FROM
table;
ALTER TABLE table_reduced ENABLE KEYS;
RENAME TABLE table TO table_old;
RENAME TABLE table_reduced TO table;
DROP TABLE `table_old`;