首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提高MySQL 7天滚动平均查询的性能?

如何提高MySQL 7天滚动平均查询的性能?
EN

Stack Overflow用户
提问于 2020-08-06 04:25:17
回答 1查看 39关注 0票数 0

我有下面的查询,它计算一个7天的滚动平均,但目前它运行4分钟,因为WHERE b.serverId = a.serverId线。我的问题是如何改进这个查询,使其花费毫秒到秒?测试数据集为250 K行。

代码语言:javascript
复制
SELECT   a.serverId,
         s.serverName,
         a.playersOnline,
         DATE(a.pingTime) AS pingDate,
         Round( ( SELECT SUM(b.playersOnline) / COUNT(b.playersOnline)
                    FROM pings AS b
                   WHERE b.serverId = a.serverId AND 
                         DATEDIFF(a.pingTime, b.pingTime) BETWEEN 0 AND 6
                ), 2 ) AS '7dayMovingAvg'
    FROM pings AS a
    JOIN `server` AS s
      ON s.serverId = a.serverId
   WHERE a.serverId = 1
GROUP BY pingDate
ORDER BY a.pingTime;

表:

服务器表

serverId - PK,索引

serverIp静脉曲张

serverPort int(16)

serverName静脉曲张

启用tinyint(1)

Pings表

serverId FK,索引(参考服务器表)

pingTime日期时间,索引

playersOnline int(5)

playersMax int(5)

EN

回答 1

Stack Overflow用户

发布于 2020-08-06 05:30:03

代码语言:javascript
复制
           WHERE b.serverId = a.serverId AND 
                 DATEDIFF(a.pingTime, b.pingTime) BETWEEN 0 AND 6

学习“可增强的”。然后换到

代码语言:javascript
复制
           WHERE b.serverId = a.serverId AND 
                 b.pingTime BETWEEN a.pingTime
                                AND a.pingTime - INTERVAL 6 DAY

(注意:我可能算错了)

然后添加这个“复合”索引:

代码语言:javascript
复制
INDEX(serverId, pingTime)

这不计算:

代码语言:javascript
复制
GROUP BY pingDate
ORDER BY a.pingTime

你可能想

代码语言:javascript
复制
GROUP BY pingDate
ORDER BY pingDate

如需进一步讨论,请提供SHOW CREATE TABLEEXPLAIN SELECT ...

你是否在重新计算所有日内的移动平均值?昨天不会变的,是吗?把它放在另一张桌子上。然后只计算每晚的平均电流。

(“指数移动平均”更容易计算,而且可能更快。考虑切换到它。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63276830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档