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。
我有一个日志 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。