Итак, у меня есть довольно большой стол с детализированными ценовыми тиками (с использованием MariaDB).
CREATE TABLE `table` (
`num` int(11) NOT NULL AUTO_INCREMENT,
`datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`pairs` varchar(40) NOT NULL,
`price` decimal(16,10) NOT NULL,
`volume` decimal(22,10) NOT NULL,
PRIMARY KEY (`num`),
KEY `datetime_pairs` (`pairs`,`datetime`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
Я хочу сделать среднечасовое значение этих цен по типу входа, если данные старше x дней. Для этого примера я возьму 7 дней. Я пришел с этим запросом.
SELECT `num`, `datetime`, `pairs`, `price`, `volume`,
AVG(`price`) AS `priceAVG`, AVG(`volume`) AS `volumeAVG`
FROM table
WHERE DATE_FORMAT(`datetime`, '%Y-%m-%d %H:00:00')
< DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 7 DAY), '%Y-%m-%d %H:00:00')
GROUP BY DATE_FORMAT(`datetime`, '%Y-%m-%d %H:00:00'), `pairs`
Выполнение запроса занимает ~ 25 секунд. Я не думаю, что смогу оптимизировать это.
Это МОЖЕТ напечатать результат, который я ищу ... однако я действительно не уверен, что лучше всего отвечать на мой вопрос, как только у меня будут данные для работы.
Вставить этот результат и удалить старые данные? Это могло бы испортить номер первичного ключа num
, что сделало бы его несовместимым с порядком datetime
.
Обновление старых данных с использованием результата запроса SELECT и удаление старых данных без этих обновленных строк? Вот чего я сейчас пытаюсь достичь ...
Я думаю, что иметь дубликаты таблицы, возможно, не вариант, поскольку у меня есть сто таких таблиц для обработки, и ресурсы ЦП также должны быть рассмотрены. Я использую cron и php для приведения этих запросов. Я мог бы выполнять эту операцию каждые 12 или 24 часа.
Какой метод подойдет в этом случае?
Является ли запрос на обновление реалистичным способом обработки этого?