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


How to insert missing rows and update exists in 10M table

Q:如何在相对较短的时间内插入缺失的行并更新数据源中的存在

存在很少更新的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)

Rating字段由下一个字段集决定:week_numberaudience_idchannel_ids_weekendstart_time让我们将来称之为"complex_key"。

我所做的(php服务器端):

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

使用PHP在事务块中创建一个包含更新和插入的SQL文件(BEGIN…COMMIT)。通过命令行psql加载该文件。这种方法不会减少获取/计算时间,但会在更新过程中显著提高速度。