WHERE b.serverId = a.serverId AND
DATEDIFF(a.pingTime, b.pingTime) BETWEEN 0 AND 6
Узнайте о «sargeable». Затем измените на
WHERE b.serverId = a.serverId AND
b.pingTime BETWEEN a.pingTime
AND a.pingTime - INTERVAL 6 DAY
(Внимание: у меня может быть неправильное арифметическое c)
Затем добавьте этот 'составной' индекс:
INDEX(serverId, pingTime)
Это действительно не вычисляется:
GROUP BY pingDate
ORDER BY a.pingTime
Вероятно, вы захотите
GROUP BY pingDate
ORDER BY pingDate
Для дальнейшего обсуждения укажите SHOW CREATE TABLE
и EXPLAIN SELECT ...
Вы пересчитываете все скользящие средние на все дни? Вчерашнее не изменится, правда? Сохраните его в другой таблице. Затем вычисляйте только текущее среднее значение каждую ночь.
(«Экспоненциальное скользящее среднее» вычислить проще и, вероятно, быстрее. Рассмотрите возможность перехода на него.)