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;
我會試試看,看看我能否得到它的工作,謝謝。 –
謝謝你的建議,它的工作非常好,我的整個更新負載下降到5分鐘以下。道歉我沒有足夠的XP來提高你的答案。我會在上面發佈我的解決方案。 –