我有以下查询,它计算 7 天的滚动平均值,但是由于WHERE b.serverId = a.serverId
线路的原因,目前需要 4 分钟才能运行。我的问题是如何改进这个查询,以便它需要几毫秒到几秒?测试数据集约为 250k 行。
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 varchar
服务器端口 int(16)
服务器名称 varchar
启用 tinyint(1)
Ping 表
serverId FK,索引(参考服务器表)
pingTime 日期时间,索引
玩家在线 int(5)
玩家最大 int(5)