Рассмотрим этот запрос:
select d.*
from data d
where channel_id=83
order by channel_id,timestamp
Выполнение выполняется немедленно, как channel_id, отметка времени проиндексирована:
CREATE TABLE `data` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`channel_id` int(11) DEFAULT NULL,
`timestamp` bigint(20) NOT NULL,
`value` double NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `data_unique` (`channel_id`,`timestamp`),
KEY `IDX_ADF3F36372F5A1AA` (`channel_id`),
CONSTRAINT `FK_ADF3F36372F5A1AA` FOREIGN KEY (`channel_id`) REFERENCES `entities` (`id`)
)
Как только я добавляю простую LAG (), запрос замедляется доcrawl:
select d.*
,lag(value) over (order by channel_id,timestamp)
from data d
where channel_id=83
order by channel_id,timestamp
Объяснить план:
+------+-------------+-------+------+----------------------------------+----------------------+---------+-------+--------+-----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+------+----------------------------------+----------------------+---------+-------+--------+-----------------+
| 1 | SIMPLE | d | ref | data_unique,IDX_ADF3F36372F5A1AA | IDX_ADF3F36372F5A1AA | 5 | const | 759654 | Using temporary |
+------+-------------+-------+------+----------------------------------+----------------------+---------+-------+--------+-----------------+
Объяснить план без оператора LAG ():
+------+-------------+-------+------+----------------------------------+----------------------+---------+-------+--------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+------+----------------------------------+----------------------+---------+-------+--------+-------+
| 1 | SIMPLE | d | ref | data_unique,IDX_ADF3F36372F5A1AA | IDX_ADF3F36372F5A1AA | 5 | const | 759730 | |
+------+-------------+-------+------+----------------------------------+----------------------+---------+-------+--------+-------+
Есть ли проблемы с производительностью оконных функций вmariadb или я делаю этот запрос неправильно?