gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 21:31:56 25 4
gpt4 key购买 nike

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

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

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

UPDATE table1 SET val1=val3 where id=some_id;

UPDATE 命令可以工作,但花费的时间太长,1500 万行需要 813 秒。我有大约 2000 亿行要更新,所以这将需要永远......我想大约 118 天。

关于如何更快地做到这一点有什么技巧/建议吗?

SHOW CREATE TABLE table1;  

CREATE TABLE `table1` (
`id` int(10) unsigned NOT NULL,
`val1` smallint(5) unsigned NOT NULL,
`val2` mediumint(7) unsigned NOT NULL,
`val3` smallint(5) unsigned NOT NULL,
`val4` binary(1) NOT NULL DEFAULT '\0',
`val5` float DEFAULT NULL,
PRIMARY KEY (`id`,`val1`,`val2`,`val3`)
) ENGINE=TokuDB DEFAULT CHARSET=latin1 `COMPRESSION`=TOKUDB_LZMA

最佳答案

更新此列将使整行被重写。这需要时间并且 IO 成本很高。两种选择:

  1. 选择数据时使用三元条件:Select 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。重要一点:为了尽可能少地重写,请确保仅更新 if val1<>val3

关于MySQL将数十亿行的同一表中的一列复制到另一列花费太长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35190409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com