1

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

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

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

虽然迭代这样的项目真的很慢,但我需要数据库的关系方面(XML 表示用户可以购买的项目,所以我不能为这些项目生成新的 ID,而只是批量加载它们)。

实现这一点的最佳方式是什么,因为循环遍历 XML 并单独查找每个项目真的很慢。

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

== 编辑 ==

这个过程的基本循环如下:

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 中的每个条目,我需要检查对象是否已经存在。

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

4

2 回答 2

2

您可以INSERT ... ON DUPLICATE KEY UPDATE 在这里使用查看链接。首先更新所有要禁用的记录。然后运行上述INSERT ... ON DUPLICATE KEY UPDATE查询以使用新数据插入或更新现有行,并将它们设置为启用。

于 2011-06-08T17:07:12.690 回答
1

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

于 2011-06-08T17:07:16.667 回答