计算移动平均值时的MySQL自连接优化
我创建了一个mysql查询,通过使用多个自连接来计算数据的移动平均值,如下所示。这会消耗大量时间,并且每个查询的数据行数为100k。有没有办法进一步优化它以减少时间计算移动平均值时的MySQL自连接优化,mysql,optimization,self-join,moving-average,Mysql,Optimization,Self Join,Moving Average,我创建了一个mysql查询,通过使用多个自连接来计算数据的移动平均值,如下所示。这会消耗大量时间,并且每个查询的数据行数为100k。有没有办法进一步优化它以减少时间 select a.rownum,a.ma_small_price, b.ma_medium_price from (SELECT t3.rownum, AVG(t.last_price) as 'ma_small_price' FROM temp_data t3 left JOIN temp_data t ON t
select a.rownum,a.ma_small_price, b.ma_medium_price from
(SELECT t3.rownum, AVG(t.last_price) as 'ma_small_price'
FROM temp_data t3
left JOIN temp_data t ON t.rownum BETWEEN ifnull(t3.rownum,0) - @psmall AND t3.rownum
GROUP BY t3.rownum)
inner join
(SELECT t3.rownum, AVG(t.last_price) as 'ma_medium_price'
FROM temp_data t3
left JOIN temp_data t ON t.rownum BETWEEN ifnull(t3.rownum,0) - @pmedium AND t3.rownum
GROUP BY t3.rownum) b on a.rownum = b.rownum
因为您运行的是MySQL 8,所以应该能够使用窗口函数更高效地获得相同的结果。如果看不到样本数据,很难100%确定,但这应该很接近。请注意,要在窗口框架中使用变量,需要使用准备好的语句:
SET @sql = '
SELECT rownum,
AVG(last_price) OVER (ORDER BY rownum ROWS BETWEEN ? PRECEDING AND CURRENT ROW) AS ma_small_price,
AVG(last_price) OVER (ORDER BY rownum ROWS BETWEEN ? PRECEDING AND CURRENT ROW) AS ma_medium_price
FROM temp_data';
PREPARE stmt FROM @sql;
EXECUTE stmt USING @psmall, @pmedium;
超过。。。在MySQL 8.0和MariaDB 10.x中都慢得令人失望
我喜欢指数移动平均线,因为它比移动平均线更容易计算。以下内容大致相当于Nick的建议。这运行得更快,但结果略有不同:
SELECT rownum,
@small := @small + 0.5 * (last_price - @small) AS mae_small_price,
@med := @med + 0.2 * (last_price - @med) AS mae_med_price
FROM ( SELECT @small := 10, @med := 10 ) AS init
JOIN temp_data
ORDER BY rownum;
该系数控制指数移动平均值适应数据变化的速度。它应该大于0且小于1
我将EPA初始化为的10是对平均值的粗略猜测-它会对前几个值产生偏差,但随着更多值的加入,它会逐渐被淹没。您使用的mysql版本是什么?介于ifnullt3.rownum、0-@psmall和t3.rownum之间。t3的rownum组。rownum-IFNULL明显过量。如果t3.rownum为NULL,则BETWEEN将给出NULL==FALSE,因为其上限为NULL。sql server版本为8.0.13sql server!=mysqlPlease在代码问题中给出一个-包括剪切、粘贴和可运行的最小代码以及作为代码给出的最小代表性数据。对于包含DBMS和DDL的SQL,包括约束、索引和表格初始化。用于SQL性能,包括解释结果和统计信息。请研究并总结。对于SQL,它包括优化/性能的基础知识,可立即生成索引、计划、统计信息和可搜索性。学习并应用这些基础知识后,请重新优化。谢谢Rick…它工作得很快!我正在探索EPA如何对我的用例更有用。@AnkurBansal-有没有关于EPA是否适合您的应用的词?是的,我调整了系数,以找到与MAs趋势相似的趋势。