php - 将数据从文件写入数据库并更新旧数据

标签 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进行多次插入?

具有相同结果的任何其他方法也可以!

最佳答案

将文件加载到与原始表具有相同架构的临时表中。然后执行:

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/

相关文章:

sql - T-SQL NULLIF 返回 NULL 为零

php - 更新到 php5.3 中断连接到 mysql 数据库

javascript - 单独打印json元素

mysql - JBOSS 7 MYSQL 缺少依赖项错误

mysql - SQL 通过表显示查询

sql - 如何获取 SQL 中的最后一列?

php - 连接3张表是1张表性能MYSQL

php - 读取文件时如何删除跳过空行

mysql - 与 MYSQL 失去连接

php - 基于SQL Dump建立SQL Server