从mysql innodb中删除大量数据

min*_*eow 5 mysql sql innodb

我需要在生产数据库中删除大量数据,该数据库的大小约为100GB.如果可能的话,我想尽量减少停机时间.

我的删除选择标准很可能是

DELETE*FROM POSTING WHERE USER.ID = 5 AND UPDATED_AT <100

删除它的最佳方法是什么?

  • 建立索引?
  • 编写一个顺序脚本,一次通过行1000分页删除?

Pio*_*ski 7

您可以尝试使用mysql doc中提到的方法:

  1. 选择不要删除的行到与原始表具有相同结构的空表中:

    INSERT INTO t_copy SELECT*FROM t WHERE ...;

  2. 使用RENAME TABLE以原子方式移动原始表并将副本重命名为原始名称:

    RENAME TABLE t TO t_old,t_copy TO t;

  3. 删除原始表:

    DROP TABLE t_old;


new*_*ver 1

最好的方法是使用 LIMIT 子句增量删除(按 10000 项),但不应用排序。这将允许 MySQL 更频繁地刷新结果,并且事务不会很大。您可以使用已安装的任何具有 mysql 连接器的编程语言轻松完成此操作。请务必在每个语句后提交。

索引肯定会有所帮助,但在 100 GB 表上构建索引也需要一段时间(无论如何,当您将来要重用索引时,它是值得创建的)。顺便说一句,您当前的查询不正确,因为引用了此处未列出的表 USER。您应该小心使用索引,以便优化器可以从使用它中受益。