MySQL将一列复制到同一个表中另一列的数十亿行需要太长时间

时间:2016-02-04 00:28:59

标签: mysql mariadb

在MySQL(实际上是MariaDB)中,我有下表:

csv(file, {delimiter: tab, relax: true, columns: true}, (err, out) => { });

我正在尝试使用以下语句将val3复制到val1:

table1:  
   id  |  val1  |  val2  |  val3  |  val4  |  val5
----------------------------------------------------

UPDATE命令工作但是花费的时间太长,15百万行需要813秒。我有大约200亿行更新,所以它需要永远......我想大约118天。

有关如何更快地完成此操作的任何技巧/建议?

UPDATE table1 SET val1=val3 where id=some_id;

2 个答案:

答案 0 :(得分:0)

更新此列会使整行被重写。它会需要时间,而且价格昂贵。两个选项:

  1. 选择数据时使用三元条件:选择IF(some_id = id,val3,val1)...

  2. 在不同的更新中拆分查询:更新表集val1 = val3,其中id = some_id,val1<> val3和id> = x,id< = x + 1000000。如果您可以使用不同的x(1,1000001,2000001,...)运行相同的查询,那么它将更好地利用您的服务器核心,而不是使用单个核心。一旦其中一个查询结束,您就会知道这部分工作已经完成。您的瓶颈将是IO和您将能够使用的核心数量。

    2.1。重点:为了尽可能少地重写,请确保只有在val1<> val3

  3. 时才更新

答案 1 :(得分:0)

尝试删除主键,并将其替换为id字段上的非唯一索引(这需要使WHERE子句有效)。做所有更新。然后删除id索引并添加回主键。

ALTER TABLE table1 DROP PRIMARY KEY, ADD KEY (id);
do all the updates
ALTER TABLE table1 DROP KEY(id), ADD PRIMARY KEY(id, value1, value2, value3);