计算移动平均值时的MySQL自连接优化

计算移动平均值时的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

我创建了一个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.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趋势相似的趋势。