2016-09-19 102 views
1

我需要更新數據庫中超過4百萬行。我們目前正在使用mysql 5.1並且更新非常慢。目前超過30分鐘的時間少於10萬行,這是不可取的。如何在mysql中快速更新數百萬行

我有一個sql腳本,它自動生成我需要的更新語句並將它們輸出到文件中。我試圖將其分解爲多個文件,以查看這是否會加快速度,但無濟於事。

我的腳本使用選擇CONCAT生成更新語句,並將其寫入文件,如下所示:

SELECT CONCAT("UPDATE status SET next_status_id=", ts_next.id, ",duration=", 
SUM(UNIX_TIMESTAMP(ts_next.status_date) - UNIX_TIMESTAMP(ts.status_date)), 
    " WHERE id =", ts.id, " AND next_status_id IS NULL AND duration = 0;") 
into outfile '/tmp/status_updates.sql' 
FIELDS TERMINATED BY '' 
LINES TERMINATED BY '\n' 
FROM 
    status ts 
     LEFT JOIN 
     status ts_next ON ts_next.ticket_id = ts.ticket_id 
     AND ts_next.id = (SELECT 
      MIN(id) 
     FROM 
      status first_status 
     WHERE 
      first_status.id > ts.id AND first_status.ticket_id = ts.ticket_id) 
      GROUP BY ts.id; 

理想情況下,我想盡可能快地獲取這些更新完成,並願意接受所有的建議,以最小的影響做到這一點的最佳方式。

SOLUTION:

UPDATE status ts1, 
    (SELECT 
    ts_next.id as next_status_id, 
    ts.id as status_id, 
    IFNULL(SUM(UNIX_TIMESTAMP(ts_next.status_date) - UNIX_TIMESTAMP(ts.status_date)), 0) as duration 
    FROM 
    status ts 
     LEFT JOIN 
     status ts_next ON ts_next.ticket_id = ts.ticket_id 
     AND ts_next.id = (SELECT 
      MIN(id) 
     FROM 
      status first_status 
     WHERE 
      first_status.id > ts.id AND first_status.ticket_id = ts.ticket_id) 
      GROUP BY ts.id) ts2 
    SET ts1.next_status_id = ts2.next_status_id, ts1.duration = ts2.duration 
    WHERE id=ts2.status_id AND ts1.next_status_id IS NULL; 

回答

0

使用 「更新 - 選擇」。我認爲這應該是更新多行的最快方法。因此看到這個問題: MySQL - UPDATE query based on SELECT Query

+0

我會試試看,看看我能否得到它的工作,謝謝。 –

+1

謝謝你的建議,它的工作非常好,我的整個更新負載下降到5分鐘以下。道歉我沒有足夠的XP來提高你的答案。我會在上面發佈我的解決方案。 –