MySQL Lead оптимизация
В основном у меня таблица содержит просмотры страниц пользователя.
как это
CREATE TABLE `pageViews` (
`statId` int(11) NOT NULL AUTO_INCREMENT,
`deviceId` varchar(36) DEFAULT NULL,
`userId` varchar(36) DEFAULT NULL,
`sessionId` varchar(36) DEFAULT NULL,
`actionType` varchar(45) DEFAULT NULL,
`actionDetail` json DEFAULT NULL,
`browser` varchar(250) DEFAULT NULL,
`resolution` varchar(10) DEFAULT NULL,
`language` varchar(10) DEFAULT NULL,
`uri` varchar(250) DEFAULT NULL,
`location` varchar(300) DEFAULT NULL,
`initial` tinyint(4) DEFAULT NULL,
`containerId` int(11) DEFAULT NULL,
`stepId` int(11) DEFAULT NULL,
`creationDate` bigint(13) DEFAULT NULL,
`logged` tinyint(4) DEFAULT '0',
PRIMARY KEY (`statId`),
KEY `event_creationDate` (`sessionId`,`creationDate`),
KEY `containerId_stepId` (`containerId`,`stepId`,`uri`),
KEY `containerId_initial` (`containerId`,`initial`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Попытка выбрать строки из таблицы, которая содержит около 1 млн записей, с помощью функции опережения для расчета времени, затраченного на каждую позицию
в настоящее время то, что пришло мне в голову
SELECT
sessionId,
if (
(lead(sessionId) OVER (ORDER BY sessionId, creationDate)) = sessionId,
((lead(creationDate) OVER (ORDER BY sessionId, creationDate)) - creationDate) / 1000,
null
) as timeSpent,
date_format(from_unixtime(creationDate/1000), '%Y-%m-%d') date
FROM
pageViews
но на самом деле это неэффективно - возвращать строки в течение 10 минут и более, поэтому искать решения, которые были бы гораздо более надежными.
моя конечная цель - получить что-то к этому
select
avg(totalSessionTime) averge,
date
from (
select
sum(timeSpent) totalSessionTime,
sessionId,
date
from (
SELECT
sessionId,
if (
(lead(sessionId) OVER (ORDER BY sessionId, creationDate)) = sessionId,
((lead(creationDate) OVER (ORDER BY sessionId, creationDate)) - creationDate) / 1000,
null
) as timeSpent,
date_format(from_unixtime(creationDate/1000), '%Y-%m-%d') date
FROM
pageViews
where
creationDate > 1500000000000
) z
where
timeSpent is not null
group by
sessionId, date
) y
group by
date;
Любые комментарии по индексам, sql и т. Д. Приветствуются