1

我有一个大型数据库,我正在尝试通过 perl 进行更新。要添加的信息来自我无法控制的 csv 文件(但它是受信任的——它来自我们公司的不同部分)。对于文件中的每条记录,我需要添加它(如果它不存在)或什么都不做(如果它存在)。添加记录包括通常的INSERT INTO,但在此之前可以为特定条目运行,UPDATE必须运行特定的。

为了具体起见,假设该文件有 10,000 个条目,但其中 90% 已经在数据库中。导入记录的最有效方法是什么?我可以看到一些明显的方法:

  • 从数据库中提取此类型的所有记录,然后检查文件中的每个条目的成员资格。缺点:大量数据传输,可能足以使服务器超时。
  • 从文件中读取条目,并仅针对带有RLIKE 'foo|bar|baz|...'查询(或stuff = 'foo' || stuff = 'bar' || ...查询,但这似乎更糟)的那些记录发送查询。缺点:巨大的查询,可能足以阻塞服务器。
  • 读入文件,为每个条目发送一个查询,然后在适当的时候添加它。缺点:数以万计的查询,非常慢。

除了UPDATE要求之外,这似乎是一个相当标准的问题,大概有一个标准的解决方案。如果有,它可能可以通过适当使用auto_increment主键测试来适应我的情况。

4

2 回答 2

1

标准解决方案是使用INSERT IGNOREwhich 在插入因约束而失败时不会引发错误。这对你没有多大用处,因为它不会让你有机会UPDATE在你知道INSERT它会起作用之前做。但是,如果您可以在之后进行更新,那么这是理想的:只需INSERT IGNORE每条记录,然后UPDATE如果成功则执行。

如果记录已经存在,则意味着具有匹配唯一键的记录已经在数据库中,所以我不明白这个RLIKE势必会很慢的提议。

我将使用 PerlSELECT count(*) FROM table WHERE key = ?对每条记录使用的 CSV 文件进行 grep,并删除结果非零的任何内容。

然后对过滤后的 CSV 数据中剩下的所有内容执行您UPDATE的操作。INSERT

于 2012-05-29T21:13:48.207 回答
0

如果在迭代列表时不断刷新数据,则无需使服务器超时。

于 2012-05-29T21:09:59.173 回答