MySQL删除大量行并插入新数据而不会中断

时间:2014-05-16 05:53:24

标签: php mysql

我有一个遗留API应用程序,它通过特定日期的API调用获取大量JSON数据。

为了使用新信息更新数据库,我必须删除与该日期相关的所有行,然后循环并插入所有新行。每个日期约1200行。插件需要作为一个“循环”来完成。因为JSON数据需要在每一行上完成额外的工作。

这种情况经常发生 - 大约每5分钟发生一次。

在此期间 - 有用户定期全天候访问当前数据。我有报告称,有时加载报告时,没有数据,或者数据似乎不完整。

我受过教育的猜测是,他们正在删除和重新加载'之间访问报告。数据的。我怎样才能确保无缝地发生这种情况?

我需要知道的是,数据库事务会解决此问题吗?我知道如果出现问题,DB Transactions允许在操作期间回滚 - 但它们是否也允许在一个事务中进行无缝删除和更新?

即。像这样的东西

try {
    $db->beginTransaction();

    $db->query('delete query');
    $db->query('insert query');

    $db->commit();
} catch (Exception $e) {
    $db->rollback();
}

3 个答案:

答案 0 :(得分:1)

有一件事是将数据进程锁定在数据库中,例如mysql可以按行锁定。

transaction model and locking

另外,在mysql中,你可以一次性写入存储过程到exe的所有插入和删除,并且在执行期间其他函数无法访问数据。

答案 1 :(得分:1)

首先,您需要使用InnoDB。 MyISAM无法处理除LOCK TABLE之外的任何类型的交易,这会使您的用户陷入困境。

其次,请确保您的表格已正确编入索引,以使DELETE查询不会变得愚蠢 - 也就是说,不进行全表扫描。可能这意味着索引一些DATE或DATETIME字段。

第三,不要这样删除:

DELETE FROM table WHERE DATE(timestampcol) = '2014-01-01'

而是这样做:

DELETE FROM table WHERE timestampcol  = '2014-01-01'

或者,如果您的timestampcol包含日期和时间(即包含非午夜时间),请确保您可以像这样使用索引:

DELETE FROM table WHERE timestampcol >= '2014-01-01'
                    AND timestampcol < '2014-01-01' + INTERVAL 1 DAY

第五,使用交易进行此操作。这基本上就在你的问题中。

第六,有没有什么方法可以UPDATE行,而不是DELETEINSERT?您是否可以逐行完成此工作而不会破坏用户阅读的数据的完整性?如果可以的话,这可能是一种在用户&#39;之下更改日期的方法。鼻子&#34;在交易完成时不让他们等待。

第七:这更难:您可以使用分区表,并在您更新的那一天换掉分区。如果每个分区只有1200行,那么对于您正在做的事情来说,这可能是一个巨大的过度杀伤。但它会以编程和系统管理员的麻烦而扩大规模。

答案 2 :(得分:0)

我认为数据库交易不会解决问题。在您的情况下,因为您删除了所有数据:您可以通过执行&#34;截断表&#34;来加速删除语句。截断表更快,因为它不会保留日志。

请记住: 截断将通过自动增量重置PK的计数器