SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 06.03.2010 23:44:14

roxor
Участник
Зарегистрирован: 06.03.2010
Сообщений: 1

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

Добрый день!

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

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

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

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

Неактивен

 

#2 07.03.2010 05:20:35

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

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

Запрос нормальный, но:

1. Почему в action стоит текстовая сессия а не ее id?
2. И ключик на action(session_id) также нужен.

Задача 2 решается добавлением MAX(time) - MIN(time). При условии
выполнения моих двух пунктов — будет сносная скорость. Но при очень
большом количестве сессий — надо будет денормализовывать, конечно.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson