我有一个包含 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
进行多次插入?
具有相同结果的任何其他方法也可以!
最佳答案
将文件加载到与原始表具有相同架构的临时表中。然后执行:
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)
包含将存储在该列中的值(如果该列不重复)。
关于php - 将数据从文件写入数据库并更新旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23202977/