我有下面的查询,它计算一个7天的滚动平均,但目前它运行4分钟,因为WHERE b.serverId = a.serverId线。我的问题是如何改进这个查询,使其花费毫秒到秒?测试数据集为250 K行。
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)
发布于 2020-08-06 05:30:03
WHERE b.serverId = a.serverId AND
DATEDIFF(a.pingTime, b.pingTime) BETWEEN 0 AND 6学习“可增强的”。然后换到
WHERE b.serverId = a.serverId AND
b.pingTime BETWEEN a.pingTime
AND a.pingTime - INTERVAL 6 DAY(注意:我可能算错了)
然后添加这个“复合”索引:
INDEX(serverId, pingTime)这不计算:
GROUP BY pingDate
ORDER BY a.pingTime你可能想
GROUP BY pingDate
ORDER BY pingDate如需进一步讨论,请提供SHOW CREATE TABLE和EXPLAIN SELECT ...
你是否在重新计算所有日内的移动平均值?昨天不会变的,是吗?把它放在另一张桌子上。然后只计算每晚的平均电流。
(“指数移动平均”更容易计算,而且可能更快。考虑切换到它。)
https://stackoverflow.com/questions/63276830
复制相似问题