2014-01-18 43 views
0

我得到了一個製表符分隔的文件存儲一些的SKU和他們的電流量的報告。 這意味着大部分時間庫存是相同的,我們只需要更新數量。 但是,可能會發生這樣的情況:新的SKU位於我們必須插入而不是更新的列表中。不需更新擺在首位,然後插入新的數據(報告)到MySQL

我們使用的是InnoDB表,用於存儲那些單品。目前,我們只是削減由製表符和換行符的文件,並進行了INSERT ... ON DUPLICATE KEY UPDATE查詢這是非常低效的,因爲INSERT是貴INNODB,對不對?也很棘手,因爲當一個包含大量SKU的列表大於20k時,只需要幾分鐘。

所以我現在的解決方案只是將LOAD DATA INFILE放入tmp表格中,之後再做INSERT ... ON DUPLICATE KEY UPDATE,我認爲這應該會更快。

另外還有另一種解決方案,首先做一個簡單的UPDATE,只有當有一些左,它執行和INSERT?這將是完美的,但我無法找到任何有關它。有沒有辦法刪除返回update: 1的行?

+0

'當有很多的SKU在> 20K,它只是需要一些minutes'未來列表 - 什麼是錯的與您的系統。這應該最多需要幾秒鐘的時間。 – ethrbunny

+0

是的,我現在。目前它是如何完成的。這就是爲什麼我們想改變,但我們希望這次能夠成功。那麼你有什麼建議嗎? –

+0

你是在分批輸入還是一次只做一個輸入? – ethrbunny

回答

0
  1. 通過表的PRIMARY KEY對CSV文件進行排序。

  2. LOAD DATA INFILE到一個單獨的表(如你所說)

  3. INSERT INTO real_table SELECT * FROM tmp_table的對重複密鑰更新... - 注:這是一個INSERT。

警告:這可能會在第3步期間阻止其他用途的表格。解決方案:將CSV分成1000行塊。在每個塊之後執行COMMIT。