我有一个包含大约500 000行的表。每天一次,我将尝试将此表与外部API同步。大多数情况下,自上次更新以来几乎没有或根本没有做出任何更改。我的问题基本上是如何构建我的MySQL查询以获得最佳性能?我已经考虑过使用insert ignore,但它不是最好的方法,因为只插入几行,MySQL必须循环遍历表中的所有行。我还考虑过使用LOAD_DATA_INFILE在临时表中插入所有行,然后选择原始表中尚未存在的行,然后删除临时表。也许别人有更好的建议?
提前谢谢!
答案 0 :(得分:0)
我通常使用临时表和LOAD DATA INFILE
批量加载器。使用动态创建的查询尝试插入记录时,批量加载器的效率要高得多。
如果使用与API中的键相关的适当唯一键索引永久表,则应该发现INSERT
和UPDATE
语句的工作速度非常快。我使用的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
表中的keywords
为NULL
)。
另请注意,在此示例中,我需要同时使用广告组ID和关键字ID来唯一标识关键字,因为当AdWords API存在于多个广告中时,它会为相同的关键字/匹配类型组合提供相同的ID基。