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

Post optimization needed after deleting rows in a MYSQL Database

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

我的table们都有一个MYISAM引擎。

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

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

谢谢大家!

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

您可以在删除后运行 OPTIMIZE TABLE。优化 table 将帮助您解决一些问题(取自文档):

  • 如果 table 删除或拆分行,修复 table。
  • 如果索引页未排序,请对其进行排序。
  • 如果 table 的统计信息不是最新的(并且无法通过排序索引完成修复),请更新它们。

根据文档:http://dev.mysql.com/doc/refman/5.7/en/optimize-table.html

Use OPTIMIZE TABLE in these cases, depending on the type of table:

...

After deleting a large part of a MyISAM or ARCHIVE table, or making many changes to a MyISAM or ARCHIVE table with variable-length rows (tables that have VARCHAR, VARBINARY, BLOB, or TEXT columns). Deleted rows are maintained in a linked list and subsequent INSERT operations reuse old row positions. You can use OPTIMIZE TABLE to reclaim the unused space and to defragment the data file. After extensive changes to a table, this statement may also improve performance of statements that use the table, sometimes significantly.

计划 A:使用 table 的时间序列 PARTITIONing,以便将来删除 'instantaneous' 因为 DROP PARTITION。更多讨论 here。仅当您要删除 all 早于 X.

的行时,分区才有效

B 计划:为避免长时间锁定,将删除分块。参见 here 。可以选择后跟 OPTIMIZE TABLE 以回收 space.

方案C:把你想保留的复制过来,然后放弃其余的。如果您只需要保留 table.

的一小部分,这尤其有用
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文件包含数据;它永远不会缩小。删除会在其中留下漏洞。进一步的插入(和更新)将优先使用这些孔而不是增加 table。计划 A 和 C(但不是 B)将避免漏洞,真正释放 space。