我有一个包含大约 500 000 行的表。每天一次,我将尝试将此表与外部 API 同步。大多数情况下,自上次更新以来几乎没有更改或没有更改。我的问题基本上是我应该如何构建我的 MySQL 查询以获得最佳性能?我曾考虑过使用插入忽略,但感觉不是最好的方法,因为只会插入几行,而且 MySQL 必须遍历表中的所有行。我还考虑过使用 LOAD_DATA_INFILE 在临时表中插入所有行,然后选择原始表中不存在的行,然后删除临时表。也许其他人有更好的建议?
先感谢您!
我有一个包含大约 500 000 行的表。每天一次,我将尝试将此表与外部 API 同步。大多数情况下,自上次更新以来几乎没有更改或没有更改。我的问题基本上是我应该如何构建我的 MySQL 查询以获得最佳性能?我曾考虑过使用插入忽略,但感觉不是最好的方法,因为只会插入几行,而且 MySQL 必须遍历表中的所有行。我还考虑过使用 LOAD_DATA_INFILE 在临时表中插入所有行,然后选择原始表中不存在的行,然后删除临时表。也许其他人有更好的建议?
先感谢您!
我通常使用临时表和LOAD DATA INFILE
批量加载程序。批量加载器比尝试使用动态创建的查询插入记录要高效得多。
如果您使用与 API 中的键相关的适当唯一键来索引您的永久表,那么您应该会发现INSERT
andUPDATE
语句工作得非常快。我使用的查询类型示例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。