【发布时间】:2012-02-07 19:07:57
【问题描述】:
我有一个爬虫,它可以访问许多站点并查找即将发生的事件以及另一个实际上应该将它们放入数据库的脚本。目前,插入数据库是我的瓶颈,我需要一种比现在更快的方法来批处理查询。
让这件事变得棘手的是,单个事件包含三个表中的数据,这些表彼此具有键。要插入单个事件,我插入位置或获取该位置已经存在的 id,然后插入实际的事件文本和其他数据,或者如果事件 id 已经存在(有些是每周重复等),最后插入带有位置和事件 ID 的日期。
我不能使用 REPLACE INTO,因为它会孤立具有相同键的旧数据。我在Tricky MySQL Batch Query 中询问了这个问题,但如果 TLDR 的结果是我必须检查哪些键已经存在,预先分配那些不存在的键,然后为每个表进行一次插入(即在 php 中完成大部分工作) .这很好,但问题是,如果一次处理多个批次,它们都可以选择预分配相同的键,然后相互覆盖。无论如何我可以回到这个解决方案吗?这些批次必须能够并行工作。
我现在所拥有的是,我只是在批处理期间关闭索引并分别插入每个事件,但我需要更快的东西。任何想法都会对这个相当棘手的问题有所帮助。 (这些表现在是 InnoDB ......事务可以帮助解决这些问题吗?)
【问题讨论】:
标签: php mysql performance innodb batch-processing