Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день!
Помогите пожалуйста разобраться в сложном запросе.
Существуют две таблицы, "сессия" пользователя
CREATE TABLE `user_session`
(
`ID` int(11) NOT NULL auto_increment,
`SESSION` varchar(32) NOT NULL,
`IP` varchar(32) NOT NULL,
PRIMARY KEY (`ID`)
)
INSERT INTO `user_session` (`ID`, `SESSION`, `IP`) VALUES (1, '8015146757231327', '127.0.0.1');
и действия пользователя за конкретную "сессию"
CREATE TABLE `user_action`
(
`ID` int(11) NOT NULL auto_increment,
`SESSION` varchar(32) NOT NULL,
`ACTION` varchar(32) NOT NULL,
`TIME` int(11) NOT NULL,
PRIMARY KEY (`ID`)
)
INSERT INTO `user_action` (`ID`, `SESSION`, `ACTION`, `TIME`) VALUES (1, '8015146757231327', 'login', 1267870435);
INSERT INTO `user_action` (`ID`, `SESSION`, `ACTION`, `TIME`) VALUES (2, '8015146757231327', 'select', 1267870435);
INSERT INTO `user_action` (`ID`, `SESSION`, `ACTION`, `TIME`) VALUES (3, '8015146757231327', 'select', 1267870435);
INSERT INTO `user_action` (`ID`, `SESSION`, `ACTION`, `TIME`) VALUES (4, '8015146757231327', 'buy', 1267870435);
необходимо подсчитать количество действий в каждой сессии одним запросом
Сейчас реализовал через JOIN:
SELECT
`user_session`.`IP`,
`user_session`.`SESSION`,
COUNT(*)
FROM `user_session`
LEFT JOIN `user_action` ON `user_session`.`SESSION` = `user_action`.`SESSION`
GROUP BY
`user_session`.`IP`,
`user_session`.`SESSION`
проблема в том что на практике полей в `user_session` будет 20 и будет использоваться WHERE с 5 условиями LIKE. К тому же среднее количество действий на каждую сессию около 1000.
Скажите оптимально ли так считать количество действий? При тестировании возникают большие нагрузки и медленная производительность. Помогите пожалуйста увеличить скорость этого скрипта.
задача 2: посчитать сколько времени заняла каждая сессия Т.е. нужна разница между уникальными `user_action`.`TIME` для каждой сессии. Учитывая как медленно работает предыдущий запрос, даже не знаю как подойти.
На выходе в любом случае должа быть таблица: `IP` `СЕССИИ` `КОЛ-ВО СОБЫТИЙ` `ОБЩЕЕ ВРЕМЯ`
Буду очень признателен получить идею или помощь. Спасибо.
Неактивен
Запрос нормальный, но:
1. Почему в action стоит текстовая сессия а не ее id?
2. И ключик на action(session_id) также нужен.
Задача 2 решается добавлением MAX(time) - MIN(time). При условии
выполнения моих двух пунктов — будет сносная скорость. Но при очень
большом количестве сессий — надо будет денормализовывать, конечно.
Неактивен