新值将整天添加到
MySQL数据库中.此表中有超过800万行.因为有很多旧值,所以我想在不停止Java程序插入值的情况下清理它们.
我将此查询发送到MySQL:
DELETE FROM `tablename`
WHERE `from` <= (date_add(now(), interval -20 DAY))
但是,Java程序会停止向表中添加新值.有没有办法在不编辑Java程序的情况下处理这个问题?
我愿意每天一次将查询作为cronjob运行.
我也尝试使用参数LOW_PRIORITY,但它没有任何区别.
最佳答案 您似乎正在使用旧的MyISAM数据库引擎.
不幸的是,MyISAM使用表级锁定.插入,更新或删除行时,将保留对该表的所有其他更改,直到该请求完成.在您的情况下,长时间运行DELETE会阻止任何INSERT进入该表.
您可以通过将表引擎更改为InnoDB来改进它,如下所示:
ALTER TABLE mytable ENGINE = innodb;
InnoDB引擎是完全事务性的,并且在INSERT,UPDATE或DELETE期间不会锁定整个表,因此您的问题应该消失.