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