将本地数据库与外部API同步

时间:2011-04-21 09:56:11

标签: mysql database api google-adwords

我有一个包含大约500 000行的表。每天一次,我将尝试将此表与外部API同步。大多数情况下,自上次更新以来几乎没有或根本没有做出任何更改。我的问题基本上是如何构建我的MySQL查询以获得最佳性能?我已经考虑过使用insert ignore,但它不是最好的方法,因为只插入几行,MySQL必须循环遍历表中的所有行。我还考虑过使用LOAD_DATA_INFILE在临时表中插入所有行,然后选择原始表中尚未存在的行,然后删除临时表。也许别人有更好的建议?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

我通常使用临时表和LOAD DATA INFILE批量加载器。使用动态创建的查询尝试插入记录时,批量加载器的效率要高得多。

如果使用与API中的键相关的适当唯一键索引永久表,则应该发现INSERTUPDATE语句的工作速度非常快。我使用的INSERT查询类型的示例如下:

INSERT INTO keywords(api_adgroup_id, api_keyword_id, keyword_text, match_type, status) 
SELECT a.api_id, a.keyword_text, a.match_type, a.status
FROM tmp_keywords a LEFT JOIN keywords b ON a.api_adgroup_id = b.api_adgroup_id AND a.api_keyword_id = b.api_keyword_id
WHERE b.api_keyword_id IS NULL

在此示例中,我在OUTER JOIN表上执行keywords以检查它是否已存在。只插入临时表中主表中不匹配的新行(api_keyword_id表中的keywordsNULL)。

另请注意,在此示例中,我需要同时使用广告组ID和关键字ID来唯一标识关键字,因为当AdWords API存在于多个广告中时,它会为相同的关键字/匹配类型组合提供相同的ID基。