【问题标题】:Check if exists records to insert or update In MYSQL检查是否存在要在 MYSQL 中插入或更新的记录
【发布时间】:2015-12-18 02:33:11
【问题描述】:

每周我需要将 50K~200K 行记录从原始 CSV 文件加载到我的系统中。

目前我的解决方案是将 CVS 加载到临时表(在处理后将其清空),然后运行我的 存储过程 以将数据操作到我系统中的不同相关表。如果记录已存在,将运行 update 查询(CSV 中 80% 的记录已在我的系统表中),如果不存在,将 插入 记录。

我现在面临的问题是表格增长到几百万条记录,大约。每张桌子5~6百万。 “Select Exist”似乎也很慢,之后我批量更改为左连接表也很慢。 即使我刚刚加载了 5K 条记录,也可能需要几个小时才能完成存储过程过程。

在比较表以决定插入/更新记录时,有什么好的和更快的解决方案来处理大量记录?

谢谢!!

杰克

【问题讨论】:

  • 从表索引开始。然后,您可以查看几篇有关管理和扩展大型数据库的在线文章。
  • 我之前做过索引。目前,当表增长到数百万行时,它开始表现不佳。
  • 看看 MySQL 的 "REPLACE INTO" 语句,它可能是您正在寻找的解决方案:dev.mysql.com/doc/refman/5.0/en/replace.html
  • 是的,Miki,我也在考虑使用 REPLACE INTO ;),只是不确定性能是否与使用 left join 一样好。

标签: php mysql csv left-join


【解决方案1】:

执行以下过程会减少你的时间

首先尝试更新记录并检查受影响的行数,如果受影响的行数 = 0,然后插入记录。

但请确保每次需要修改 modified_Date 如果表中不存在 modified_Date 则需要添加,因为如果新旧记录中的所有数据相同,那么它将创建新查询,因为没有修改在表记录中,所以它会返回 0。

【讨论】:

    【解决方案2】:

    MySQL 响应慢几乎总是索引错误或使用不正确的问题。

    如果您使用正确的键或/和索引,则 INSERT ... ON DUPLICATE KEY UPDATE ... 应该可以工作。

    尝试仅在现有索引/键上工作。使用 EXPLAIN SELECT 检查您的语句。

    恕我直言,您基于 tmp 表的预处理没问题。

    【讨论】:

      猜你喜欢
      • 2012-03-06
      • 1970-01-01
      • 2021-01-23
      • 2011-02-17
      • 2016-02-29
      • 2018-02-25
      • 2016-03-24
      • 2021-09-13
      • 1970-01-01
      相关资源
      最近更新 更多