Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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 如何提高Insert INTO(…)select查询的性能?_Mysql - Fatal编程技术网

Mysql 如何提高Insert INTO(…)select查询的性能?

Mysql 如何提高Insert INTO(…)select查询的性能?,mysql,Mysql,现在我正在尝试编写一个查询,以减少数据库中的数据。我的计划是从一分钟内得到平均值 INSERT INTO reduced (current, total, time_stamp) SELECT AVG(current) AS average, MAX(total) as total, MAX(time_stamp) FROM ( SELECT * from data2 WHERE id <= '500' AND id >= '6' ) AS test

现在我正在尝试编写一个查询,以减少数据库中的数据。我的计划是从一分钟内得到平均值

INSERT INTO reduced (current, total, time_stamp)
SELECT
    AVG(current) AS average,
    MAX(total) as total,
    MAX(time_stamp)
FROM
(
    SELECT * from data2  WHERE id <= '500' AND id >= '6'
) AS test
WHERE
    time_stamp <= '2019-05-03 21:24:30' AND
    time_stamp >= '2019-05-03 21:23:30'
如果我只执行Select语句,它将在0002秒内完成。但只要我添加插入部分,它就需要几秒钟。3-5秒 这里的问题是,我想对整个数据集重复该查询始终添加一分钟,这样计算起来会花费太多时间。 所以我想知道是否有一种方法可以加速这个插入过程。 通常insert语句的工作速度也非常快。
因此,我认为在一个查询中链接insert和select时会出现问题。

多亏了Tim Biegeleisen,我想出了以下解决方案:

INSERT INTO reduced (current, total, time_stamp) 
SELECT AVG(current) AS average
     , MAX(total) as total
     , MAX(time_stamp) 
  FROM data2 
 GROUP 
    BY UNIX_TIMESTAMP(time_stamp) DIV 60 

这里的想法是使用group by创建时间间隔,这样我就不必使用循环遍历数据集,只需使用insert一次。

子查询并不理想,也许我们可以在此基础上进行改进,但这里突出的第一点是,您只插入了一条记录。您打算在select查询中使用GROUP BY吗?您好@Tim,谢谢您的回答。我不知道,您可以使用group by进行时间间隔。我的查询现在看起来是这样的:INSERT INTO reduced current,total,time\u stamp选择AVGcurrent作为average,MAXtotal作为total,MAXtime\u stamp由UNIX\u timestamp time\u stamp DIV 60从data2组中选择,运行正常。非常感谢:@lucas你能发布你自己的解决方案作为答案吗?子查询并不理想,也许我们可以对此进行改进,@TimBiegeleisen非常肯定至少现代的5.7+MySQL优化器足够聪明,可以看到交付的表是一个不变的结果。不知道如何调用它。。它可以将WHERE从内部SQL推送到外部SQL,并可以完全删除内部SELECT..->存储一堆特定于时间段的聚合数据,却无法将其与时间段关联起来,这有点奇怪。是的,我承认这不是最好的解决方案。但对于我的用例来说,它已经足够好了,因为我只使用这些数据进行可视化。用户不必每秒钟查看一次数据。通过这个查询,我可以减少发送给客户机的数据量?但这是无序的数据@草莓:无序是什么意思?关系数据库中的行表示无序集。