我有一个目前为10GB的日志表。它在过去的两年里有很多数据,我真的觉得在这一点上我并不需要那么多。我错误地认为在表中有多年的数据是不好的(较小的表更好)?
我的桌子都有MYISAM的引擎。
我想删除2014年和2015年的所有数据,很快我会做2016年,但是在我运行DELETE语句之后我很担心,究竟会发生什么。我理解,因为它的ISAM会发生无法写入的锁定吗?我可能会按月删除数据,并在深夜进行,以尽量减少数据,因为它是一个生产数据库。
我的主要兴趣是:在删除之后我应该采取某种行动吗?我是否需要手动告诉MYSQL对我的表执行任何操作,或者MYSQL是否会执行所有内务处理,回收所有内容,重新编制索引,并最终在我将要删除的400,000k记录之后优化我的表。
谢谢大家!
答案 0 :(得分:4)
计划A:使用表格的时间序列PARTITIONing
,以便将来删除由于DROP PARTITION
而“即时”。更多讨论here。仅当您要删除早于X的所有行时,分区才有效。
计划B:为了避免冗长的锁定,请删除删除。见here。随后可以选择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文件包含数据;它永远缩小。删除会在其中留下漏洞。进一步插入(和opdates)将优先使用孔来生长表。计划A和C(但不是B)将避免漏洞,并真正释放空间。
答案 1 :(得分:2)
执行删除后,您可以运行OPTIMIZE TABLE
。优化表将帮助您完成一些事情(取自文档):
根据文档:http://dev.mysql.com/doc/refman/5.7/en/optimize-table.html
在这些情况下使用OPTIMIZE TABLE,具体取决于表的类型:
...
删除MyISAM或ARCHIVE表的大部分内容后,或者删除 对具有可变长度行的MyISAM或ARCHIVE表进行的许多更改 (包含VARCHAR,VARBINARY,BLOB或TEXT列的表)。删除 行在链表和后续INSERT操作中维护 重用旧行位置。您可以使用OPTIMIZE TABLE来回收 未使用的空间并对数据文件进行碎片整理。经过广泛的改变 对于表,此语句还可以提高语句的性能 使用该表,有时显着。