2016-09-19 50 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来提高你的答案。我会在上面发布我的解决方案。 –