Как повысить производительность этого запроса со скользящим средним размером MySQL 7 дней? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть следующий запрос, который вычисляет скользящее среднее за 7 дней, однако в настоящее время для его выполнения требуется 4 минуты из-за строки WHERE b.serverId = a.serverId. Мой вопрос: как улучшить этот запрос, чтобы он занимал от миллисекунд до секунд? Набор тестовых данных составляет ~ 250 тыс. Строк.

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

serverPort int (16)

serverName varchar

включен tinyint (1)

Таблица Pings

serverId FK, проиндексировано (ссылается на таблицу серверов)

pingTime datetime, проиндексировано

playerOnline int (5)

playerMax int (5)

1 Ответ

0 голосов
/ 06 августа 2020
           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 ...

Вы пересчитываете все скользящие средние на все дни? Вчерашнее не изменится, правда? Сохраните его в другой таблице. Затем вычисляйте только текущее среднее значение каждую ночь.

(«Экспоненциальное скользящее среднее» вычислить проще и, вероятно, быстрее. Рассмотрите возможность перехода на него.)

...