我是房地产联合网站的开发人员,目前我无法找到有效更新大量房源/记录的方法(2,000,000多个房源)。
我们目前接受来自约20个不同网站的XML Feed,其中包含房地产列表。大多数传入的Feed都很小(约100个左右的列表),但是我们有几个包含〜1,000,000个列表的XML Feed。小的饲料可以快速简便地解析,但是,大饲料每次需要2-3小时。
包含在网站上查看的列表的当前“实时”数据库表是MyISAM。我选择了MyISAM,因为约95%的查询是SELECT
个。实际上唯一有写入(UPDATE / INSERT查询)的时间是在处理XML提要期间。
目前的流程如下:
有一个CRON可以启动主解析脚本。
循环遍历feeds
表并抓取外部XML Feed源文件。然后它运行所述文件,并且对于XML文件中的每个记录,它检查listings
表以查看是否需要更新或插入列表(如果它是新列表)。
这一切都发生在现场表格上。我想知道的是,如果有人有更好的逻辑来在后台进行这些更新/插入,以免减慢生产表,最终降低用户体验。
delta 表是否是最佳选择?也许在单独的数据库上做所有繁重的工作,只是将新表复制到生产数据库?在一个单独的 workhorse 域名中?我是否应该有一个单独的listings
表来完成所有解析,即InnoDB而不是MyISAM?
我们要努力实现的是让我们的系统能够在一天内频繁更新列表,而不会减慢网站速度。我们的竞争对手吹嘘他们在某些情况下每5分钟更新一次。我只是看不出那是怎么回事。
我现在正在工作所以这更像是为了让球滚动而进行大脑转储。如果有人希望我提供表格示意图,我会非常高兴。
总结:我正在寻找一种方法,通过几十个外部XML提要/文件频繁更新我们数据库中的数百万条记录(每日)。我只需要一些关于如何有效地,高效地实现这一点的逻辑,以便不用它拖动生产服务器。
答案 0 :(得分:1)
首先,对于现有的3小时导入,尝试在事务中包装每100个插入。它们将一次性写入数据库,这可能会大大加快速度。玩弄100值 - 最佳值取决于您想要它的弹性,以及您的事务缓存有多少内存。 (这当然要求你切换到不同的引擎)。
对于已知提供较大文件的提供程序,请尝试保留先前XML下载的副本,然后在旧文件和新文件之间进行文本差异。如果您充分设置了上下文设置(即更改行周围未更改的行数),则可以捕获已更改项的主键。然后,您只需进行少量更新。
当然,如果您的提供商维护其XML列表的顺序,这将有所帮助。如果他们不是文本排序,那么差异可能仍然比导入所有内容更快。
FWIW,我认为每5分钟完成一次刷新可能是不可行的。我希望您的提供商不会满意您以此频率下载1M记录!