MySQL Lead оптимизация - PullRequest
       8

MySQL Lead оптимизация

0 голосов
/ 11 января 2019

В основном у меня есть таблица, содержащая пользовательские просмотры страниц.

как это

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 и т. Д. Приветствуются

...