Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql MariaDB:更新数十亿条记录的最佳方式_Mysql_Database_Timestamp_Mariadb - Fatal编程技术网

Mysql MariaDB:更新数十亿条记录的最佳方式

Mysql MariaDB:更新数十亿条记录的最佳方式,mysql,database,timestamp,mariadb,Mysql,Database,Timestamp,Mariadb,我正在寻找一种最佳方法来更新表3下一个表示例中的数十亿条记录。每个条目都与以毫秒为单位的时间戳相关联。在本例中,表3已过时,表1和表2是最新的,具有各自数据的实际条目。我没有任何东西将表1和表2链接到表3。如果需要,也请让我知道,因为我不是数据库专家 表1有4列: Timestamp T_0 PRIMARY KEY (ex: '2014-07-04 16:17:16.800000') X1_T1 VARCHAR X2_T1 VARCHAR X3_T1 VARCHAR Timestamp T_0

我正在寻找一种最佳方法来更新表3下一个表示例中的数十亿条记录。每个条目都与以毫秒为单位的时间戳相关联。在本例中,表3已过时,表1和表2是最新的,具有各自数据的实际条目。我没有任何东西将表1和表2链接到表3。如果需要,也请让我知道,因为我不是数据库专家

表1有4列:

Timestamp T_0 PRIMARY KEY (ex: '2014-07-04 16:17:16.800000')
X1_T1 VARCHAR
X2_T1 VARCHAR
X3_T1 VARCHAR
Timestamp T_0 PRIMARY KEY (ex: '2014-07-04 16:17:16.800000')
X1_T2 VARCHAR
X2_T2 VARCHAR
X3_T3 VARCHAR
表2有4列:

Timestamp T_0 PRIMARY KEY (ex: '2014-07-04 16:17:16.800000')
X1_T1 VARCHAR
X2_T1 VARCHAR
X3_T1 VARCHAR
Timestamp T_0 PRIMARY KEY (ex: '2014-07-04 16:17:16.800000')
X1_T2 VARCHAR
X2_T2 VARCHAR
X3_T3 VARCHAR
表3有7列:

Timestamp T_0 PRIMARY KEY (ex: '2014-07-04 16:17:16.800000')
X1_T1 VARCHAR
X2_T1 VARCHAR
X3_T1 VARCHAR
X1_T2 VARCHAR
X2_T2 VARCHAR
X3_T3 VARCHAR
我成功地使用循环时间戳的过程更新了表3,并使用以下命令更新了每一行:

SET tmp_T_0=(SELECT '2014-01-05 17:00:00.000000'); // set to the start of the table's timestamp
label1: LOOP
  UPDATE TABLE3 SET
      X1_T1=(select X1_T1 FROM TABLE1 where T_0 = tmp_T_0),
      X2_T1=(select X2_T1 FROM TABLE1 where T_0 = tmp_T_0),
      X3_T1=(select X3_T1 FROM TABLE1 where T_0 = tmp_T_0),
      X1_T2=(select X1_T2 FROM TABLE2 where T_0 = tmp_T_0),
      X2_T2=(select X2_T2 FROM TABLE2 where T_0 = tmp_T_0),
      X3_T2=(select X3_T2 FROM TABLE2 where T_0 = tmp_T_0)
 WHERE T_0 = tmp_T_0;  

 SET tmp_T_0=(SELECT TIMESTAMP(tmp_T_0,'00:00:00.001')); //ADD one millisecond and continue

 SET LoopInt=(SELECT(LoopInt + 1));
 IF LoopInt < LoopEnd THEN
   ITERATE label1;
 END IF;
 LEAVE label1;
END LOOP label1;
对于100000个条目,上述方法大约需要53秒。这是不可接受的,因为它需要大约100天来完成其余的条目

应该注意的是,表3中的每个时间戳条目都有来自表1和/或表2的数据,这不是必须的,即,表3中的时间戳可能包含X1_T1 X2_T1和X3_T1的数据,而其他值X1_T2 X2_T2和X3_T2为空

任何建议都会有帮助。
谢谢你

试试这个查询,把一小时的信息从表1拉到表3怎么样

UPDATE TABLE3 AS t3
  JOIN TABLE1 AS t1 ON t3.T_0 = t1.T_0
   SET t3.X1_T1 = IFNULL(t1.X1_T1,t3.X1_T1),
       t3.X2_T1 = IFNULL(t1.X2_T1,t3.X2_T1),
       t3.X3_T1 = IFNULL(t1.X3_T1,t3.X3_T1)
 WHERE t3.T_0 >= '2014-01-05' + INTERVAL 0 HOUR
   AND t3.T_0 <  '2014-01-05' + INTERVAL 1 HOUR
你把表1和表3连在一起。这是正确的,因为您已经说过表3包含所有可能的时间戳,而表1没有。按照我编写这个查询的方式,它不会触及表3中没有对应行的行。我想这就是你想要的

最后,IFNULL函数只安排在存在非NULL TABLE1数据时更改TABLE3数据

看,如果您的TABLE1数据是稀疏的,也就是说,它在一个表中有许多随机分散的有效值,这些值大部分为空。您可能希望使用三个类似这样的查询,因此除非您有新数据,否则您实际上不会更改TABLE3中的行。更改行中的值相对昂贵

UPDATE TABLE3 AS t3
  JOIN TABLE1 AS t1 ON t3.T_0 = t1.T_0
   SET t3.X1_T1 = t1.X1_T1
 WHERE t3.T_0 >= '2014-01-05' + INTERVAL 0 HOUR
   AND t3.T_0 <  '2014-01-05' + INTERVAL 1 HOUR
   AND t1.X1_T1 IS NOT NULL

UPDATE TABLE3 AS t3
  JOIN TABLE1 AS t1 ON t3.T_0 = t1.T_0
   SET t3.X2_T1 = t1.X2_T1
 WHERE t3.T_0 >= '2014-01-05' + INTERVAL 0 HOUR
   AND t3.T_0 <  '2014-01-05' + INTERVAL 1 HOUR
   AND t1.X2_T1 IS NOT NULL

UPDATE TABLE3 AS t3
  JOIN TABLE1 AS t1 ON t3.T_0 = t1.T_0
   SET t3.X3_T1 = t1.X3_T1
 WHERE t3.T_0 >= '2014-01-05' + INTERVAL 0 HOUR
   AND t3.T_0 <  '2014-01-05' + INTERVAL 1 HOUR
   AND t1.X3_T1 IS NOT NULL
您需要对TABLE2数据重复所有这些操作

您可能希望在一个查询中运行整个过程。不要那样做!这是一种工作,你需要能够做一个小时的时间,并在需要时重新启动。我建议一次一小时,但那是360万行。您可能希望一次做更小的块,比如6分钟360千行


如果我是你,我肯定会在你几天的表3的副本上调试整个交易。

上述方法还为每个父查询运行9个单独的子查询。。。不管你做什么,这将是一项长期的工作。你能说更多关于索引数据的内容吗?表3中是否每毫秒有一行?感谢您的输入,是的,表3中每毫秒有一行,但表1和表2中的数据不那么频繁。这是6个月的数据。1200亿行/记录。感谢您提出上述建议。我将尝试一下,并按照您的建议,使用几天的数据,重新发布使用您的方法更新所有记录所需的估计时间。这是一个很棒的方法。谢谢,我确实应用了它,它节省了很多执行时间。更新整个表3总共花费了15小时11分钟20.96秒。我采用了360万行的一小时方法。然而,当我对“一天”的数据(即I=1到24的24小时循环)运行试验模拟时,将两个表连接到表3需要15秒。当我将循环增加到6个月的数据时,即I=1到4320,它花费了15个小时,而根据24小时的估计模拟,它本应花费45分钟。我做错了什么,不是吗?比我想象的要快。太好了!我怀疑您15小时的运行时间比较小的运行时间非线性地大,因为您的服务器内存不足,无法存储一些临时数据,因此必须将其刷新到硬盘上。现在,在接下来的99天零9小时里,你打算做什么-仔细检查你的结果是否正确!但你知道的。再次感谢,结果是正确的。我仔细检查了一下。我还有很多事情要做:-