在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;
答案 0 :(得分:0)
更新此列会使整行被重写。它会需要时间,而且价格昂贵。两个选项:
选择数据时使用三元条件:选择IF(some_id = id,val3,val1)...
在不同的更新中拆分查询:更新表集val1 = val3,其中id = some_id,val1<> val3和id> = x,id< = x + 1000000。如果您可以使用不同的x(1,1000001,2000001,...)运行相同的查询,那么它将更好地利用您的服务器核心,而不是使用单个核心。一旦其中一个查询结束,您就会知道这部分工作已经完成。您的瓶颈将是IO和您将能够使用的核心数量。
2.1。重点:为了尽可能少地重写,请确保只有在val1<> val3
答案 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);