【问题标题】:How to update large number of records via XML files?如何通过 XML 文件更新大量记录?
【发布时间】:2014-11-28 18:46:42
【问题描述】:

我是房地产联合网站的开发人员,目前无法找到有效更新大量房源/记录(超过 2,000,000 个房源)的方法。

我们目前接受来自大约 20 个不同网站的 XML 提要,其中包含房地产列表。大多数传入的提要都很小(大约 100 个列表),但我们有几个 XML 提要包含约 1,000,000 个列表。小提要的解析快速而简单,但是,大提要每个要花费 2-3 小时以上。

包含在网站上查看列表的当前“实时”数据库表是 MyISAM。我选择 MyISAM 是因为对表的约 95% 的查询是 SELECTs。实际上,只有在处理 XML 提要期间才会有写入(UPDATE/INSERT 查询)。

目前的流程如下:

  1. 有一个启动主解析脚本的 CRON。

  2. 它遍历feeds 表并获取外部 XML 提要源文件。然后,它遍历所述文件,并针对 XML 文件中的每条记录检查 listings 表以查看是否需要更新或插入列表(如果它是新列表)。

这一切都发生在现场桌子上。我想知道的是是否有人有更好的逻辑来使这些更新/插入在后台发生,以免减慢生产表的速度,并最终降低用户体验。

delta 表会是最佳选择吗?也许在一个单独的数据库上完成所有繁重的工作,然后将新表复制到生产数据库?完全在一个单独的 workhorse 域上?我是否应该有一个单独的 listings 表来执行所有解析,这将是 InnoDB 而不是 MyISAM?

我们想要完成的是让我们的系统能够在一天中频繁更新列表,而不会降低网站速度。我们的竞争对手吹嘘他们在某些情况下每 5 分钟更新一次列表。我只是不明白这怎么可能。

我现在正在工作,所以这更像是一个大脑转储,只是为了让球滚起来。如果有人希望我提供表格示意图,我会非常高兴。

总之:我正在寻找一种方法,通过几十个外部 XML 提要/文件频繁更新我们数据库中的数百万条记录(每天)。我只需要一些关于如何有效且高效地实现这一点的逻辑,以免拖累生产服务器。

【问题讨论】:

  • So this question is more of a discussion. 与堆栈溢出无关。
  • 如果你能指出我正确的方向,而不是仅仅指出一个新手的错误,这会很有帮助。干杯。
  • 别担心@Marcus - 一套盔甲有时在这里很有用!但即使是离题的问题,有时也可以在 cmets 中收集到有用的花絮。

标签: php mysql xml


【解决方案1】:

首先,对于您现有的 3 小时导入,请尝试将每 100 次插入包装在一个事务中。它们将一次性写入数据库,这可能会大大加快速度。玩转 100 值 - 最佳值将取决于您想要它的弹性,以及您的事务缓存有多少内存。 (这当然需要您切换到不同的引擎)。

对于已知提供较大文件的提供商,请尝试保留以前下载的 XML 的副本,然后在旧文件和新文件之间进行文本比较。如果您充分设置上下文设置(即更改行周围的未更改行数),您可能能够捕获更改项的主键。然后,您只需进行少量更新。

当然,如果您的供应商维护其 XML 列表的顺序,这将有所帮助。如果他们不这样做,那么文本排序然后 diff 可能仍然比导入所有内容更快。

FWIW,我认为每 5 分钟完全刷新一次可能是不可行的。我希望您的提供商不会对您以这种频率下载 1M 条记录感到满意!

【讨论】:

  • 感谢您的提示!我喜欢将工作卸载到 XML 比较脚本而不是针对数据库运行来进行检查的想法。我要咀嚼一下这个。你会说 Innodb 是最好的选择吗?我看到你提到的交易让我相信你建议我将我的表引擎从 MyISAM 切换到 Innodb。我对 Innodb 没有任何经验。我只知道它需要比 MyISAM 更多的配置调整。您可以分享设置 Innodb 的任何提示/链接吗?
  • Further.. 我想一个大问题一直是 MyISAM 的表锁定问题。 Innodb 具有行锁定功能,这将使脚本效率更高,写入次数更高,对吗?服务器规格仅供参考:16GB RAM,Intel(R) Xeon(R) CPU E3-1230 V2 @ 3.30GHz(8 个处理器),MySQL v5.1(我们正在升级到 v5.6,但这可能需要一段时间。所以我们将在接下来的一段时间内使用 v5.1)。
  • 我对 MySQL 调优知之甚少,但最好的方法通常是构建您的实时环境的副本,尝试各种更改,然后获取每个配置的指标。是的,要获得交易,您需要 InnoDB。我会先将写入捆绑在一起,因为这是最简单的胜利,然后从那里开始。
猜你喜欢
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
相关资源
最近更新 更多