Таблица :
id | date | id_device | total | others 15/20 columns
----------------------------------------------------
- может содержать миллионы записей
- таблица имеет индекс для столбцов id_device и date .
- это таблица, в которой каждую минуту X устройство энергии экономит свое потребление (общий столбец. Это значение, которое постоянно увеличивается).Но также могут быть пустые временные интервалы, как показано в таблице ниже.
Мне нужно рассчитать почасовое потребление данного устройства в определенный день определенного интервала часов.
Для этого у меня есть этот запрос, , который работает .Пример: 2018-10-03, интервал часа 00-01.Этот интервал означает (как и все остальные), чтобы начать с последней записи до 00 и закончить до последней записи 00. Таким образом, как и в примере выше, сумма интервала 00 составляет 300-120, 300 (последняя запись 00) 120 (последняя запись до 00). Вычитание выполняется в PHP.
id | date | id_device | total | others 15/20 columns
----------------------------------------------------
1 | 2018-10-02 23:50:20 | 1 | 100 | ....
2 | 2018-10-02 23:55:20 | 1 | 120 | ....
3 | 2018-10-03 00:01:20 | 1 | 150 | ....
.. | 2018-10-03 00:59:20 | 1 | 300 | ....
.. | 2018-10-03 01:00:20 | 1 | 350 | ....
SELECT `total` AS `total` FROM `mytable` AS `A`,
(
SELECT MIN(`date`) AS `firstValue`, MAX(`date`) AS `lastValue`
FROM `mytable`
WHERE `date` BETWEEN
COALESCE((SELECT `date` FROM `mytable` WHERE `date` < '2018-10-03 00:00:00' AND `id_device` = 1 ORDER BY `date` DESC LIMIT 1), '2018-10-03 00:00:00'
AND '2018-10-03 00:59:59'
AND `id_device` = 1
) AS `B`
WHERE `A`.`date` IN (`B`.`firstValue`,`B`.`lastValue`) AND `id_device` = 1
ORDER BY `A`.`date`
С этим запросом время выполнения составляет около 0,9 / 1,5 секунды .И это слишком медленно (мне нужно вычислять этот запрос X раз, в цикле, для каждого устройства).
Удаление подзапроса, время выполнения которого , практически 0 .Время выполнения идеально, но запрос таким образом, очевидно, меня не устраивает.
SELECT `total` AS `total` FROM `mytable` AS `A`,
(
SELECT MIN(`date`) AS `firstValue`, MAX(`date`) AS `lastValue`
FROM `mytable`
WHERE `date` BETWEEN
'2018-10-03 00:00:00'
AND '2018-10-03 00:59:59'
AND `id_device` = 1
) AS `B`
WHERE `A`.`date` IN (`B`.`firstValue`,`B`.`lastValue`) AND `id_device` = 1
ORDER BY `A`.`date`
Я тестировал подзапрос индивидуально, и время выполнения составляет , практически 0 .
SELECT `date` FROM `mytable` WHERE `date` < '2018-10-03 00:00:00' AND `id_device` = 1 ORDER BY `date` DESC LIMIT 1
Поэтому я не могу понять, почему исходный запрос такой медленный.