【发布时间】:2019-03-05 14:42:29
【问题描述】:
我必须在 mysql 中的数据集上计算移动平均线(不同时期)。我尝试了两种计算平均值的方法,但都需要相当长的时间。分享下面的代码。
方法:-1
select t1.*,
(select avg(t2.last_price)
from temp_data t2
where t2.rownum>t1.rownum-50 and t2.rownum<=t1.rownum and t1.script_code=t2.script_code) as 'ma_small_price'
from temp_data t1;
方法:-2
select t1.*, avg(t2.last_price) 'ma_small_price'
from temp_data t1
join temp_data t2
where t2.rownum>t1.rownum-50 and t2.rownum<=t1.rownum and t1.script_code=t2.script_code
group by t1.id,t1.date, t1.time;
这是表结构:
CREATE TABLE `temp_data` (
`id` int(11) NOT NULL DEFAULT '0',
`rownum` int(11) DEFAULT NULL,
`script_code` float DEFAULT NULL,
`date` date DEFAULT NULL,
`time` time DEFAULT NULL,
`last_price` float DEFAULT NULL,
`last_qty` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
rownum 是具有连续行号的列。 ID 是主键,但不是连续的,所以我不得不添加一个单独的列
示例数据链接:https://www.dropbox.com/s/z8iacqvlkjdx6ax/temp_data_sample.xlsx?dl=0
接下来我必须并行计算同一数据的多个移动平均线,但周期(在上面的代码中指定为 50)是不同的。
我的数据集庞大且不断增长(> 1 百万行),运行这些查询所需的时间很长 - 每个约 20 分钟。寻求有关如何改进这些查询以减少运行时间的输入。谢谢!!
【问题讨论】:
-
这看起来很像 Oracle 代码。你确定你使用的是 MySQL 吗?
-
是的,我确定......在我的机器上托管的 mysql 服务器中使用它们
-
请发布一些表结构和示例数据。看起来
rownum实际上是一个列名。 -
我已经添加了表结构。 rownum 是具有连续行号的列。 ID 是主键,但不是连续的,所以我不得不添加一个单独的列。不确定如何为数据添加示例附件。我怎样才能把它贴在这里?
-
您没有索引。最重要的是,这就是扼杀性能的原因。
标签: mysql moving-average