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

时间:2016-12-19 04:50:25

标签: mysql myisam

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

我的桌子都有MYISAM的引擎。

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

我的主要兴趣是:在删除之后我应该采取某种行动吗?我是否需要手动告诉MYSQL对我的表执行任何操作,或者MYSQL是否会执行所有内务处理,回收所有内容,重新编制索引,并最终在我将要删除的400,000k记录之后优化我的表。

谢谢大家!

2 个答案:

答案 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)

蒂姆和e4c5给出了一些很好的建议,我敦促他们添加答案。

执行删除后,您可以运行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来回收   未使用的空间并对数据文件进行碎片整理。经过广泛的改变   对于表,此语句还可以提高语句的性能   使用该表,有时显着。