批量 XML 导入 - 最好/最快的方式?
Posted
技术标签:
【中文标题】批量 XML 导入 - 最好/最快的方式?【英文标题】:Batch XML import - best/fastest way? 【发布时间】:2012-02-07 15:58:28 【问题描述】:我正在将产品从 XML 批量导入到 DB。我需要每天更新一次这些产品。
现在,我正在执行以下步骤:
-
从 XML 中读取 1 个产品
在数据库中按产品代码搜索
如果产品存在,则更新数据,否则,插入它
转到步骤 1 :)
但是对于包含 40 000 个产品的 XML,此方法需要 2 个小时。
我不知道如何改进它。有任何想法吗?谢谢!
【问题讨论】:
(参考) dev.mysql.com/doc/refman/5.5/en/load-xml.html Import XML into MySQL 5.1的可能重复 如果您不使用 MySql,请说明您使用的是哪个 RDBMS。 XML 的来源是什么?可以修改一下吗? 我正在使用 MySQL 源 XML 是从另一个站点下载的 XML。我可以做一些修改。你打算带它去哪里? 【参考方案1】:开始的好方法是找到延迟的位置(如果您从磁盘读取文件,很可能是数据库查找)。
考虑一个工人/生产者模式的操作,让一个线程从输入文件中读取,几个线程从队列中提取工作单元。在这种情况下,您的工作单元是 XML 文件中的产品。工作人员会倾向于数据库插入。
如果您还没有产品代码列上的索引,数据库可能会获得加速。此外,请考虑将任何项目批量插入到数据库中,而不是单条记录插入。
【讨论】:
延迟出现在 SQL 查询中。 80k 查询选择和更新/插入太多了。阅读 XML 相当不错,几秒钟内就能读完整个 XML。线程可能会很好。 绝对考虑线程化它,然后可能在该查询列上建立索引。批量插入也会真正加快速度,具体取决于您使用哪种代码来执行此操作。像这样的批处理操作可以让提交集体进行(比如每 1000 次插入提交一次),而不是在每次插入后提交。【参考方案2】:XML 不是问题,它是查询的数量。 如果可能请执行以下操作:
限制对数据库的连接和查找。如果你正在使用 SQL Server,将整个 XML 传递给存储过程,然后处理 过程中的 XML。
不要更新,而是执行所有插入。之后清理旧数据 进口。在导入过程中使用事务以确保完整性。
不要在数据库中进行比较。首先从数据库中检索所有数据, 与您的 XML 进行比较(使用 XPath),只更新需要的内容。
使用来自文本文件的数据库上传机制(实际上与 #2 相同),然后根据需要清理旧数据。
【讨论】:
以上是关于批量 XML 导入 - 最好/最快的方式?的主要内容,如果未能解决你的问题,请参考以下文章