我有一个当前为 10GB 的日志表。它有很多过去两年的数据,我真的觉得目前我不需要那么多。我是否错误地认为在表中保存多年的数据不好(表越小越好)?
我的桌子都有 MYISAM 引擎。
我想删除 2014 年和 2015 年的所有数据,很快我就会删除 2016 年的数据,但我担心运行 DELETE 语句后到底会发生什么。我明白,因为它是 ISAM,所以在无法写入的地方会发生锁定?我可能会按月删除数据,并在深夜进行,以最大程度地减少这种情况,因为它是生产数据库。
具体来说,我的主要兴趣是:删除后我应该采取某种行动吗?我是否需要手动告诉 MYSQL 对我的表执行任何操作,或者 MYSQL 会自行完成所有内务处理、回收所有内容、重新索引,并最终在我要删除的 400,000k 条记录之后优化我的表。
感谢大家!
计划 A:使用时间序列PARTITIONing
以便将来的删除是“即时的”,因为DROP PARTITION
。更多讨论here http://mysql.rjweb.org/doc.php/partitionmaint。仅当您要删除时分区才有效all早于 X 的行。
B 计划:为了避免长时间锁定,请将删除分块。看here http://mysql.rjweb.org/doc.php/deletebig。后面可选地跟随一个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.
注意:.MYD 文件包含数据;它会never收缩。删除会留下漏洞。进一步的插入(和更新)将优先使用这些孔而不是增长表。计划 A 和 C(但不是 B)将避免这些漏洞,并真正释放空间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)