2011-04-21 77 views
0

我有一個包含大約500 000行的表。每天一次,我會嘗試將此表與外部API同步。大多數情況下,自上次更新以來幾乎沒有發生任何更改。我的問題基本上是如何構建我的MySQL查詢以獲得最佳性能?我曾考慮過使用insert ignore,但由於只插入了幾行,並且MySQL必須循環遍歷表中的所有行,所以它並不是最好的辦法。我也想過使用LOAD_DATA_INFILE插入臨時表中的所有行,然後選擇不在我的原始表中的行,然後刪除臨時表。也許別人有更好的建議?同步本地數據庫與外部API

預先感謝您!

回答

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 

在本例中,我的keywords表執行OUTER JOIN判斷是否已經存在。僅插入主表中沒有匹配的臨時表中的新行(keywords表中的api_keyword_idNULL)。

另請注意,在此示例中,我需要同時使用廣告組ID和關鍵字ID來唯一標識關鍵字,因爲AdWords API在同一個ID存在多個關鍵字/匹配類型組合時提供相同的關鍵字/匹配類型組合廣告組。

相關問題