Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха информатор 3.1
Еще более удобное оповещение о флуде!

Краснодарское время: 25 Май, 2012, 10:29:13

Страниц: [1]
Печать
Автор Тема: count по временным интервалам  (Прочитано 524 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Argnist    ↓ 
05 Февраль, 2011, 11:02:35
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 130
Сила слова: 0

Есть таблица VISIT:
login varchar
begin int
end int
 
И таблица TIMES:
time_id
stamp_b int
stamp_e int
 
Нужно выбрать количество полей из таблицы VISIT, которые удовлетворяют условию:
visit.begin < times.stamp_e and visit.end > times.stamp_b
 
То есть для каждого промежутка из TIMES найти количество попадающих в этот промежуток посещений из VISIT
 
Запрос
SQL
SELECT `times`.`time_id` AS `time`, count (`visit`.`login`) AS `count` FROM `visit`, `times` WHERE `visit`.`begin` < `times`.`stamp_e` AND `visit`.`end` > `times`.`stamp_b`
GROUP BY `times`.time
вешает сервер со всякими bad gateway
Как сделать правильно?
Записан

AlexB    ↓ 
05 Февраль, 2011, 12:47:20 , спустя 1 час 44 минуты 45 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 89
Сообщений: 3425
Сила слова: 2.6

Чего план запроса говорит?
Записан

AlexB    ↓ 
05 Февраль, 2011, 12:52:23 , спустя 5 минут 3 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 89
Сообщений: 3425
Сила слова: 2.6

GROUP BY `times`.time - че за поле time?
Записан

Argnist    ↓ 
05 Февраль, 2011, 02:01:09 , спустя 1 час 8 минут 46 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 130
Сила слова: 0

time_id
 
план?)
explain запроса
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE times ALL stamp_b,stamp_e NULL NULL NULL 23040 Using temporary; Using filesort
1 SIMPLE visit ALL begin,end NULL NULL NULL 226092 Range checked for each record (index map: 0x6)
Записан

master    ↓ 
05 Февраль, 2011, 02:05:34 , спустя 4 минуты 25 секунд
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

Argnist, структуру таблицы покажи
Записан

Argnist    ↓ 
05 Февраль, 2011, 02:31:44 , спустя 26 минут 10 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 130
Сила слова: 0


Есть таблица VISIT:
login varchar
begin int
end int
 
И таблица TIMES:
time_id
stamp_b int
stamp_e int
А это чем плохо?) На всех полях стоят индексы.
Записан

Argnist    ↓ 
05 Февраль, 2011, 02:42:36 , спустя 10 минут 52 секунды
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 130
Сила слова: 0

time_id int естественно
Записан

AlexB    ↓ 
05 Февраль, 2011, 03:00:33 , спустя 17 минут 57 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 89
Сообщений: 3425
Сила слова: 2.6


time_id int естественно
если это id нахуй группировать по нему?
Мда, мощность запроса 23040 * 226092 строк, положит что хочешь ))))  
 
Спустя 2 минуты 28 секунд добавил
Индексы, как ты видишь из плана запроса, -  не работают, оно и понятно, ибо все условия на сравнение полей из разных таблиц. В каком-нибудь Оракле воозможно спасли бы materialized view, а в мускуле ... стоит подумать о денормализации таблицы visit
« Последнее редактирование: 05 Февраль, 2011, 03:00:33 от AlexB » Записан

master    ↓ 
05 Февраль, 2011, 03:51:21 , спустя 50 минут 48 секунд
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

завести счётчик, обновлять при добавлении столбца. это сведёт зависимость нагрузки от количества строк от квадратичной к линейной
Записан

Argnist    ↓ 
05 Февраль, 2011, 04:16:31 , спустя 25 минут 10 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 130
Сила слова: 0

группировка по идее чтобы он мне выдал пары
{time_id, count} - на каждый промежуток свое число. Счетчик никак, данные приходят извне.
Записан

AlexB    ↓ 
05 Февраль, 2011, 04:32:25 , спустя 15 минут 54 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: в ухо

Карма: 89
Сообщений: 3425
Сила слова: 2.6


группировка по идее чтобы он мне выдал пары
Группировка имеет смысл только по неуникальному полю, в этом и состоит ее смысл - объединить записи с одинаковым значением поля в группы. Получать пары - это уже разбор результата, к запросу отношения не имеет.
Записан

Страниц: [1]
Печать
 

Перейти в:  

Этот топик скрыли: Sinkler