ФорумРазработкаБазы данных → count по временным интервалам

count по временным интервалам

  • Argnist

    Сообщения: 130 Репутация: N Группа: Кто попало

    Spritz 5 февраля 2011 г. 11:02

    Есть таблица 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

    Запрос
    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

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 5 февраля 2011 г. 12:47, спустя 1 час 44 минуты 45 секунд

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

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 5 февраля 2011 г. 12:52, спустя 5 минут 3 секунды

    GROUP BY `times`.time - че за поле time?
  • Argnist

    Сообщения: 130 Репутация: N Группа: Кто попало

    Spritz 5 февраля 2011 г. 14:01, спустя 1 час 8 минут 46 секунд

    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

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 5 февраля 2011 г. 14:05, спустя 4 минуты 25 секунд

    Argnist, структуру таблицы покажи
    не всё полезно, что в swap полезло
  • Argnist

    Сообщения: 130 Репутация: N Группа: Кто попало

    Spritz 5 февраля 2011 г. 14:31, спустя 26 минут 10 секунд


    Есть таблица VISIT:
    login varchar
    begin int
    end int

    И таблица TIMES:
    time_id
    stamp_b int
    stamp_e int

    А это чем плохо?) На всех полях стоят индексы.
  • Argnist

    Сообщения: 130 Репутация: N Группа: Кто попало

    Spritz 5 февраля 2011 г. 14:42, спустя 10 минут 52 секунды

    time_id int естественно
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 5 февраля 2011 г. 15:00, спустя 17 минут 57 секунд


    time_id int естественно
    если это id нахуй группировать по нему?
    Мда, мощность запроса 23040 * 226092 строк, положит что хочешь ))))  

    Спустя 148 сек.
    Индексы, как ты видишь из плана запроса, - не работают, оно и понятно, ибо все условия на сравнение полей из разных таблиц. В каком-нибудь Оракле воозможно спасли бы materialized view, а в мускуле … стоит подумать о денормализации таблицы visit
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 5 февраля 2011 г. 15:51, спустя 50 минут 48 секунд

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

    Сообщения: 130 Репутация: N Группа: Кто попало

    Spritz 5 февраля 2011 г. 16:16, спустя 25 минут 10 секунд

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

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 5 февраля 2011 г. 16:32, спустя 15 минут 54 секунды


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

Пожалуйста, авторизуйтесь, чтобы написать комментарий!