@eSelf

Как оптимизировать простой sql запрос?

Не могу оптимизировать запрос.
SELECT AVG(`timestamp`) as 'grouped_timestamp', AVG(`temperature`), MIN(`temperature`), MAX(`temperature`)
FROM rpi_reg_copy WHERE `timestamp` > UNIX_TIMESTAMP(NOW() - INTERVAL 10 year) 
GROUP BY CEIL(`timestamp` / 864000)
ORDER BY 'grouped_timestamp' ASC LIMIT 578

Всего в таблице 4 млн записей. Там хранится время в формате unix timestamp и другие данные, например температура. Интервал между каждой записью 1 минута.

Мне нужно получить средние данные за 10 лет, при этом интервал между каждой точкой должен быть 10 дней (864000 секунд).

Запрос выполняется 8-10 секунд. Причем если меняю GROUP BY CEIL(`timestamp` / 864000) на просто GROUP BY `timestamp`, то запрос выполняется меньше чем за 1 секунду.

Добавлял индекс для поля timestamp, не помогло.
917f4c977c6245808e250604dd5318f0.png
Вот что показывает EXPLAIN:
75ea66391d1741999eb1874a40d232c5.png
  • Вопрос задан
  • 166 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Запрос выполняется 8-10 секунд. Причем если меняю GROUP BY CEIL(`timestamp` / 864000) на просто GROUP BY `timestamp`, то запрос выполняется меньше чем за 1 секунду.

Волне логично. Если во WHERE, GROUP BY, ON и т.п. используется функция от поля, то индекс не используется. В MySQL 5.7.6 и выше можно добавить вычислимое поле с отдельным индексом и делать группировку по нему. В младших версиях - создать отдельное поле и обновлять его триггерами AFTER INSERT/AFTER UPDATE.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы