通过更新旧数据将数据从文件写入数据库

时间:2014-04-21 18:02:19

标签: php mysql sql performance

我有一个包含500-5000行的文件,我想保存到我的数据库中。 这里的困难是,我还需要更新旧数据 - 不仅仅是插入。

所以我尝试了不同的方法:

  • 每行使用ON DUPLICATE KEY UPDATE(非常慢但符合我的需求)
  • 使用简单的数组缓冲区将100行拼写在一起(快速但覆盖 - 或者无法复制密钥)
  • LOAD DATA INFILE(非常快但覆盖/忽略所有内容)

我无法使用第一种方法将500行写入数据库。整个过程需要~25-30秒,这是很长的路要走。其他两种方法都很快(只有1-2秒),但会覆盖我需要更新的旧数据。

更新包含简单递增计数器和插入新时间戳。 所以第一种方法的查询如下:

INSERT INTO `latest`
    ( `hash`,`first_try`,`last_try`, `count_tries`, `sender` )
VALUES
    ( :hash, :first, :last, 1, :sender )
ON DUPLICATE KEY UPDATE
    `count_tries` = `count_tries` + 1,
    `last_try` = :last2

我也不知道有100次插入的可能性(我在第二种方法中尝试过)。

您是否知道有可能加快每行一行的查询速度,或者使用ON DUBLICATE KEY多次插入?

任何其他具有相同结果的方法也都很好!

1 个答案:

答案 0 :(得分:1)

将文件加载到具有与原始表相同的模式的临时表中。然后做:

INSERT INTO latest ( `hash`,`first_try`,`last_try`, `count_tries`, `sender` )
SELECT `hash`,`first_try`,`last_try`, `count_tries`, `sender` FROM temp_latest
ON DUPLICATE KEY UPDATE
    count_tries = count_tries + 1,
    last_try = VALUES(last_try)

ON DUPLICATE KEY UPDATE子句中,VALUES(col)包含存储在该列中的值,如果它不是重复的话。