powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Очень долгий запрос к MySQL
20 сообщений из 20, страница 1 из 1
Очень долгий запрос к MySQL
    #39128659
weblloyd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблица:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE `statistic` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date_end` datetime NOT NULL,
  `date_start` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `statistic_date_end_new_6f3de8e3933125c_uniq` (`date_end`),
  KEY `statistic_date_start_new_35e1f6a6a8caae3_uniq` (`date_start`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;



Задача:

Необходимо вывести кол-во ОДНОВРЕМЕННЫХ запросов, то есть кол-во ПЕРЕСЕЧЕНИЙ интервалов.

Запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select max(col)+1 as crcol 
from 
   (
   select count(s.id) as col, s1.id as id1 from statistic as s 
   inner join statistic as s1 on s.id > s1.id 
   where (s.date_start between s1.date_start and s1.date_end or s.date_end between s1.date_start and s1.date_end) 
   group by s1.id
   ) 
as A



На 60000 записях запрос работает 50 секунд :(. А их будут сотни тысяч...

Как быть?
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39128697
weblloyd,

Количество одновременных в какой момент времени? Давай возмем два граничных случая: 1) абсолютно все интервалы пересекаются; 2) пересекающихся интервалов нет вообще.
Что нужно вывести в каждом из случаев?
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39128711
weblloyd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

Все пересекающиеся интервалы из таблицы (вне зависимости от периода времени пока что).

Важен не период времени, а факт наложения одних интервалов на другие (кол-во таких пересечений)
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39128712
weblloyd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эхweblloyd,

1) абсолютно все интервалы пересекаются; 2) пересекающихся интервалов нет вообще.
Что нужно вывести в каждом из случаев?

1) total = кол-ву записей в талице (все одновременны)
2) total = 0
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39128721
weblloyd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну а вообще, у меня стоит задача аналитики:

сколько одновременных подключений было за сутки (по часам от 0 до 23)
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39128752
weblloyd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Также мне необходимо знать пик одновременных соединений (пересечений) за все время (пик нагрузки) без периода. То есть одно число.
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39128785
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
weblloyd,

Есть ли какой-нибудь порог, дольше которого регистрируемые события быть не могут никак?
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39128840
weblloyd,

то есть, по сути, тебе нужно рассчитать эрланг?
как бы из общих соображений можно сделать такой вывод: каждое начало запроса/сессии увеличивает суммарное их количество на единицу. каждое окончание запроса/сессии уменьшает их количество на единицу.
стало быть, если данные представить в виде:
"дата события", "флаг события", где дата - это одно из полей date_end/date_start, а флаг - это +1 для начала, -1 - для кончала.
далее всё что останется - расчитать накопительный итоге в сортировке по "дате события" и взять от него максимум...
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39128847
Добрый Э - Эх,

ну или немного в псевдокоде (касательно первой части - представление данных в другом виде):

Код: sql
1.
2.
3.
select date_start as x_date, +1 as flag from statistic
union all
select date_end as x_date, -1 as flag from statistic



вот теперь к этому набору нужно применить накопительный итог по полю flag в сортировке по полю x_date.
как считать накопительный итог - читать тут
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39128883
weblloyd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - ЭхДобрый Э - Эх,

вот теперь к этому набору нужно применить накопительный итог по полю flag в сортировке по полю x_date.
как считать накопительный итог - читать тут

Если вот так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create view `change` as
select date_start `date`,  1 `value` from statistic
union all
select date_end         , -1         from statistic;

select c2.`date` `date`, sum(c1.`value`) conn_amount
from change c1, change c2
where c1.`date` <= c2.`date`
group by c2.`date`;



То такой запрос выполняется 22 секунды на 4000 записей на MacBook Pro. А записей будут сотни тысяч... То есть такой запрос всегда будет медленным?
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39128901
weblloyd,

Не нужно делать неэквивалентное само объединение. Нужно попробовать использование переменных.
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39128908
weblloyd,

В таком варианте твой запрос 4 раза заходит в исходную таблицу. Отсюда и медленно....
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39128909
weblloyd,

приведи несколько строк тестовых данных в формате инсертов. чтобы я мог создать табличку, наполнить её данными и потренироваться...
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39129746
weblloyd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эхweblloyd,

приведи несколько строк тестовых данных в формате инсертов. чтобы я мог создать табличку, наполнить её данными и потренироваться...

я не знаю как использовать переменные...
приложил файл инсертов
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39129919
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
weblloyd
Необходимо вывести кол-во ОДНОВРЕМЕННЫХ запросов, то есть кол-во ПЕРЕСЕЧЕНИЙ интервалов.

На 60000 записях запрос работает 50 секунд :(. А их будут сотни тысяч...

Как быть?

Для начала нужно понять, что задача В ПРИНЦИПЕ обладает стоимостью O(N**2).

Если даже это удастся оптимизировать индексом, то задача получит стоимость O(N*log N),
т.е. МИНИМУМ -- линейный рост.

Соответственно, как только ты выходишь на достаточно большие объёмы данных, это всё автоматом перестаёт работать.
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39130351
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivweblloydНеобходимо вывести кол-во ОДНОВРЕМЕННЫХ запросов, то есть кол-во ПЕРЕСЕЧЕНИЙ интервалов.

На 60000 записях запрос работает 50 секунд :(. А их будут сотни тысяч...

Как быть?

Для начала нужно понять, что задача В ПРИНЦИПЕ обладает стоимостью O(N**2).

Если даже это удастся оптимизировать индексом, то задача получит стоимость O(N*log N),
т.е. МИНИМУМ -- линейный рост.

Соответственно, как только ты выходишь на достаточно большие объёмы данных, это всё автоматом перестаёт работать.


...ну что вы пугаете человека неверными расчетами...
задача то по среднему О(N*logN), а так как данные скорее всего
пресортированые из лога по времени, то и просто О(N)...

...а индекс нужен ну просто нафиг...
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39130375
weblloyd,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select max(@cnt := @cnt + v.flag) as erlang
  from (
         select pvt.flag
              , case pvt.flag
                  when 1 then s.date_start
                  else date_end 
                end as x_date
           from statistic_prolonged s
          cross join
                (
                  select -1 as flag
                    union all
                  select 1 as flag
                ) pvt
          order by x_date, flag
       ) v
       , (select @cnt:=0) i;

on-line проверка на sqlfiddle.com
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39131713
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcMasterZivпропущено...


Для начала нужно понять, что задача В ПРИНЦИПЕ обладает стоимостью O(N**2).

Если даже это удастся оптимизировать индексом, то задача получит стоимость O(N*log N),
т.е. МИНИМУМ -- линейный рост.

Соответственно, как только ты выходишь на достаточно большие объёмы данных, это всё автоматом перестаёт работать.


...ну что вы пугаете человека неверными расчетами...
задача то по среднему О(N*logN), а так как данные скорее всего
пресортированые из лога по времени, то и просто О(N)...

...а индекс нужен ну просто нафиг...


ты неправ...
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39131888
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivjavajdbcпропущено...



...ну что вы пугаете человека неверными расчетами...
задача то по среднему О(N*logN), а так как данные скорее всего
пресортированые из лога по времени, то и просто О(N)...

...а индекс нужен ну просто нафиг...


ты неправ...

...посмотри решение в предыдушем посте от Добрый Э - Эх.
Самымая мошная операция -- сорт, и то данные
с большой вероятностью уже пред-сортированые по времени...
...
Рейтинг: 0 / 0
Очень долгий запрос к MySQL
    #39131898
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
javajdbcСамымая мошная операция -- сорт, и то данные
с большой вероятностью уже пред-сортированые по времени...
Одна мелочь: для quick sort (АКА метод Хаара) это наихудший вариант по производительности. Оно при этом сваливается чуть ли не в O(N^2).
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Очень долгий запрос к MySQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]