4

新值整天都被添加到 MySQL 数据库中。此表中有超过 800 万行。因为有很多旧值,我想在不停止插入值的 Java 程序的情况下清理它们。

我将此查询发送到 MySQL:

DELETE FROM `tablename`
WHERE `from` <= (date_add(now(), interval -20 DAY))

但发生的情况是 Java 程序停止向表中添加新值。有什么方法可以在不编辑 Java 程序的情况下处理这个问题?我愿意每天将查询作为 cronjob 运行一次。

我也尝试过使用参数 LOW_PRIORITY,但它没有任何区别。

4

2 回答 2

2

看来您正在使用旧的 MyISAM 数据库引擎。

不幸的是 MyISAM 使用表级锁定。当插入、更新或删除一行时,对该表的所有其他更改都会暂停,直到该请求完成。在您的情况下,长时间运行会DELETE阻止任何INSERTs 进入该表。

您可以通过将表引擎更改为 InnoDB 来改进它,如下所示:

ALTER TABLE mytable ENGINE = innodb;

InnoDB 引擎是完全事务性的,不会在INSERT,UPDATE或期间锁定整个表DELETE,因此您的问题应该会消失。

于 2013-03-10T22:40:17.177 回答
0

我想你需要改变你的存储引擎。使用 .执行此操作ALTER TABLE tbl ENGINE = innodb,但请注意MyISAM 和 Innodb 之间的差异

于 2013-03-10T22:49:48.607 回答