【问题标题】:Big Data : Handling SQL Insert/Update or Merge best line by line or by CSV?大数据:逐行或按 CSV 处理 SQL 插入/更新或合并最佳?
【发布时间】:2013-05-22 16:19:37
【问题描述】:

所以基本上我有一堆 1 Gig 数据文件(压缩),其中只有包含带有时间戳和其他内容的 JSON 数据的文本文件。

我将使用 PHP 代码将此数据插入 MYSQL 数据库。

我将无法将这些文本文件存储在内存中!因此,我必须逐行处理每个数据文件。为此,我使用了 stream_get_line()。

  • 包含的一些数据将是更新,一些将是插入。

问题 使用 Insert / Select / Update 语句会更快,还是创建 CSV 文件并以这种方式导入?

创建一个批量操作的文件,然后从 sql 执行它?

我基本上需要使用不存在的主键插入数据,如果主键确实存在,则更新数据上的字段。但我会在大量的情况下这样做。

性能永远是问题。

更新 该表有 22,000 列,仅说其中 10-20 不包含 0。

【问题讨论】:

  • 您是否考虑过使用LOAD DATA INFILE 代替?如果格式正确,它可以将 CSV 直接读入数据库。
  • 正在考虑使用 LOAD DATA INFILE,唯一的问题是一些数据将被合并,而其他数据将被插入。 @tadman

标签: php mysql sql merge bigdata


【解决方案1】:

我会将所有数据加载到一个临时表中,然后让 mysql 完成繁重的工作。

  1. 通过create table temp_table as select * from live_table where 1=0;创建临时表

  2. 读取文件并创建与load data infile 加载兼容的数据产品。

  3. 将数据加载到临时表中并为主键添加索引

  4. 下一步通过在活动表和临时表之间进行内部查询来隔离更新。浏览并进行更新。

  5. 从临时表中删除所有更新(再次使用它和活动表之间的内连接)。

  6. 通过简单的插入到 live_table 中作为 select * from temp_table 处理所有插入。

  7. 放下临时桌子,回家喝一杯冰镇饮料。

对于您的用例,这可能过于简化,但稍作调整就可以了。

【讨论】:

  • 这就是我目前正在考虑的方式,写查询会很糟糕,因为主表有 22,000 列,其中大部分是零。有没有办法只导入非零并将它们与主表合并?
  • @JacobSteele 如果可能,您真的应该设计您的架构,因为 22,000 列是一个非常糟糕的主意。如果使用关联表,其中有大约 10-20 个值与特定行相关联呢?
猜你喜欢
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 2017-12-29
相关资源
最近更新 更多