2014-04-21 43 views
0

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

所以我尝试了不同的方式:每使用ON DUPLICATE KEY UPDATE线

  • 线(很慢,但适合我的需要)
  • 写100线共同使用一个简单的数组缓冲区(快,但覆盖,太 - 或失败哆来重复键)
  • LOAD DATA INFILE(非常快,但覆盖/忽略一切)

我遇到了麻烦,写500线到d atabase使用第一种方法。整个过程需要〜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个插入,太(这是我在我的seccond方法试过)。

您是否知道有任何可能加快此行每行查询或使用带有多个插入的ON DUBLICATE KEY

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

回答

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)包含将被存储在该列,如果它没有被重复的值。

+0

这就是天才。我会立即尝试,看看它是如何工作的! – Fuzzyma

+0

Aaaand第一个问题:我需要知道如何用所选行的last-try-col的值替换':last2' – Fuzzyma

+0

用此更新了答案,但找不到那在MySQL文档中? – Barmar