删除 MYSQL 数据库中的行后需要进行后期优化

Nul*_*sis 4 mysql myisam

我有一个当前为 10GB 的日志表。它有很多过去两年的数据,我真的觉得在这一点上我不需要那么多。我是否错误地认为在表中保存多年的数据不好(较小的表更好)?

我的桌子都有一个 MYISAM 引擎。

我想删除2014年和2015年的所有数据,很快我会删除2016年,但我担心运行DELETE语句后,到底会发生什么。我知道因为它是 ISAM,所以会发生一个无法写入的锁定?我可能会按月删除数据,并在深夜进行,以尽量减少它,因为它是一个生产数据库。

具体来说,我的主要兴趣是:在删除之后我应该采取某种行动吗?我是否需要手动告诉 MYSQL 对我的表做任何事情,或者 MYSQL 会自己做所有的内务管理,回收所有内容,重新索引,并最终在我将删除的 400,000k 记录之后优化我的表。

谢谢大家!

Ric*_*mes 6

计划 A:使用表的时间序列PARTITIONing,以便将来的删除是“即时的”,因为DROP PARTITION。更多讨论在这里。仅当您将删除所有早于 X 的行时,分区才有效。

计划 B:为避免长时间锁定,将删除分块。见这里。这之后可选地跟一个OPTIMIZE TABLE回收空间。

计划C:简单地复制你想保留的东西,然后放弃其余的。如果您只需要保留表的一小部分,这尤其有用。

CREATE TABLE new LIKE real;
INSERT INTO new
    SELECT * FROM real
        WHERE ... ;  -- just the newer rows;
RENAME TABLE real TO old, new TO real;   -- instantaneous and atomic
DROP TABLE old;    -- after verifying that all went well.
Run Code Online (Sandbox Code Playgroud)

注意:.MYD 文件包含数据;它永远不会缩小。删除会在其中留下漏洞。进一步的插入(和 opdates)将优先使用孔而不是生长表。计划 A 和 C(但不是 B)将避免这些漏洞,并真正释放空间。