Сложный запрос

roxor

Новичок
Сложный запрос

Добрый день!

Помогите пожалуйста разобраться в сложном запросе.

Существуют две таблицы, "сессия" пользователя

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` `СЕССИИ` `КОЛ-ВО СОБЫТИЙ` `ОБЩЕЕ ВРЕМЯ`

Буду очень признателен получить идею или помощь. Спасибо.
 

Fortop

Новичок
Во-первых индексы по полям которые участвуют в условиях

Во-вторых, IP это число.
 

dr-sm

Новичок
короче, для начала, нужно убрать поле session из таблицы user_action и заменить его на cсылку (внешний ключ) на суррогатный ключ из таблицы session. далее нада видимо добавть юник индекс на поле session.session. количество действий по в каждой сессии думаю лучше считать подзапросом только по user_session, потом джойнить уже...

-~{}~ 07.03.10 02:08:

по поводу второй задачи все просто, тебе для начала нужно получить множество действий для определенного session_id и потом выдрать из этого множества максимальное и минимальное время с помошью агрегатных функций. далее считаем между ними разницу.

hint: обе задачи сделать одним запросом
 
Сверху