如何在10M表中插入缺失的行和更新

时间:2016-04-03 22:37:06

标签: php mysql database postgresql import

问:如何在相对较短的时间内从数据源插入缺失的行和更新?

存在很少更新的Postgre表而不是强大的服务器(apache2和中间CPU的1Gb ram)。有 10 M 记录。有些记录可以更新,可以添加一些记录。

数据源是由php脚本生成的大型CSV文件。

表格结构

id (auto inc.)
week_number (1-54)
audience_id (int)
channel_id (int)
is_weekend (char, Y or N)
start_time (hours, offset in minutes after midnight)
rating (numberic. In fact main value)

评分字段由下一个字段确定: week_number audience_id channel_id is_weekend start_time 将来我们称之为“ complex_key ”。

我做了什么(php服务器端):

  • 循环通过foreach(批量选择)存储db数据并且存储对“ complex_key ”=> redis缓存中的评级。接下来逐行与 csv 进行比较并准备新的数据集。 优化:取消设置,优化数组e.t.c结果:失败。内存限制。 (php方面,不是redis)
  • 使用Pg copy创建临时表。我们的想法是使用数据库引擎来比较表并进行必要的更改。像this这样的东西。 Ofc我添加了包含“ complex_key ”哈希的附加字段并将其标记为索引。结果:如果我们比较1M +表,工作太慢。

1 个答案:

答案 0 :(得分:0)

使用PHP在事务块(BEGIN ... COMMIT)中创建更新和插入的SQL文件。通过命令行psql加载文件。此方法不会减少提取/计算时间,但会在更新期间创建速度的显着增加。