批量导入/更新数据到数据库

时间:2011-06-08 16:56:48

标签: php mysql xml database bulk-import

我有一个包含数据的大型XML文档(~10 mb)。我需要解析这个XML并通过我的数据库来更新它。有3例:

  • 自上次以来,XML中存在新数据 - 将其插入数据库
  • 项目已更改 - 在数据库中更新
  • 自上次以来已从XML中删除项目 - 在数据库中将其标记为已禁用

如果自上次检查XML以来项目的数据没有更改,请不要采取任何措施。 XML中的每个项目都有自己的ID,因此我可以轻松地从数据库中检索它。

尽管如此,迭代这些项目的速度确实很慢,但我需要数据库的关系方面(XML代表用户可以购买的项目,因此我无法为项目生成新的ID,只是批量加载它们)。

实现这一目标的最佳方法是循环XML并单独查找每个项目是真的慢。

这是使用PHP在MySQL数据库中完成的。

== edit ==

此过程的基本循环如下:

while ($data = get_next_bit_of_data_from_xml())
{
     // this next line is the slow part
     if ($object = get_object_from_database($data['id']))
     {
           // update $object
           // ...

           // persist 
           $object->save();       
     }

     // build new object and persist
     // ...
}

脚本速度太慢的原因是因为我不能使用任何类型的批量操作,如LOAD DATA INFILE,因为对于XML中的每个条目,我需要检查对象是否已经存在。

所以我真的想知道是否有人可以提出另一种方法,允许我批量加载数据,同时保持现有数据的参照完整性。

2 个答案:

答案 0 :(得分:2)

您可以使用INSERT ... ON DUPLICATE KEY UPDATE see link here。首先更新要禁用的所有记录。然后运行上面的INSERT ... ON DUPLICATE KEY UPDATE查询,以插入或更新包含新数据的现有行,并将它们设置为启用。

答案 1 :(得分:1)

您可以使用INSERT DELAYEDUPDATE LOW_PRIORITY来加快此过程。