Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Кол-во пересечений интервалов дат, очень долгий запрос / 13 сообщений из 13, страница 1 из 1
03.12.2015, 18:05:54
    #39119788
weblloyd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во пересечений интервалов дат, очень долгий запрос
Существует таблица подключений с интервалами (начало подключение и конец)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE `statistic` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date_end` datetime(6) NOT NULL,
  `date_start` datetime(6) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `statistic_date_end_6f3de8e3933125c_uniq` (`date_end`),
  KEY `statistic_date_start_35e1f6a6a8caae3_uniq` (`date_start`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;



Мне необходимо подсчитать кол-во единовременных подключений (пересечение интервалов)
Я делаю так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT COUNT(`out`.`id`)
FROM `statistic` AS `out`
WHERE EXISTS(
    SELECT *
    FROM `statistic_prolonged` AS `in`
    WHERE (
        `out`.`date_end` <= `in`.`date_start`
        AND `in`.`date_end` <= `out`.`date_start`
    )
);



Запрос по 4 тысячам записей длиться 20 секунд.
Поэтому 2 вопроса:

1) Правильно ли я вообще делаю?
2) Должен ли так долго выполняться этот запрос?
...
Рейтинг: 0 / 0
03.12.2015, 18:10:49
    #39119792
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во пересечений интервалов дат, очень долгий запрос
weblloydМне необходимо подсчитать кол-во единовременных подключений (пересечение интервалов)В смысле нужно пиковое максимальное значение?

Если конец одного интервала точно равен началу другого, то они считаются пересекающимися или нет?
...
Рейтинг: 0 / 0
03.12.2015, 18:49:47
    #39119827
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во пересечений интервалов дат, очень долгий запрос
Код: 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`;
...
Рейтинг: 0 / 0
04.12.2015, 12:51:27
    #39120423
weblloyd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во пересечений интервалов дат, очень долгий запрос
Akina, мне нужно одним запросом
...
Рейтинг: 0 / 0
04.12.2015, 12:53:37
    #39120428
weblloyd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во пересечений интервалов дат, очень долгий запрос
miksoftweblloydМне необходимо подсчитать кол-во единовременных подключений (пересечение интервалов)В смысле нужно пиковое максимальное значение?

Если конец одного интервала точно равен началу другого, то они считаются пересекающимися или нет?

Совершенно верно. Пиковое значение единовременных. Если точно равен то тоже пересекает.
...
Рейтинг: 0 / 0
04.12.2015, 13:55:59
    #39120533
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во пересечений интервалов дат, очень долгий запрос
weblloydмне нужно одним запросом
Это и есть один запрос. И одно представление.
Не нравится вьюв? ну вставь во второй запрос вместо его имени его текст как подзапрос, делов-то...

PS. Кто вообще додумался до такой структуры?
...
Рейтинг: 0 / 0
04.12.2015, 14:06:21
    #39120560
weblloyd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во пересечений интервалов дат, очень долгий запрос
AkinaPS. Кто вообще додумался до такой структуры?

А что не так со структурой?
...
Рейтинг: 0 / 0
04.12.2015, 14:22:54
    #39120592
weblloyd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во пересечений интервалов дат, очень долгий запрос
Akina
Код: 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`;



Ваш запрос выполняется 23 секунды по 4 тысячам записей...
...
Рейтинг: 0 / 0
04.12.2015, 15:08:57
    #39120660
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во пересечений интервалов дат, очень долгий запрос
weblloydчто не так со структурой?У вас есть ОДИН тип событий - изменение статуса соединения. Однако Вы почему-то в ОДНУ запись заносите информацию о ДВУХ событиях.
weblloydВаш запрос выполняется 23 секунды по 4 тысячам записей...
Правильно - вьюшка-то материализуется. Попробуйте объединить в один запрос.
Нужен быстрый запрос - используйте переменные.
...
Рейтинг: 0 / 0
04.12.2015, 17:37:10
    #39120912
weblloyd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во пересечений интервалов дат, очень долгий запрос
AkinaУ вас есть ОДИН тип событий - изменение статуса соединения. Однако Вы почему-то в ОДНУ запись заносите информацию о ДВУХ событиях.

А как, на ваш взгляд, правильно было бы хранить эти события (имеющие продолжительность)?
...
Рейтинг: 0 / 0
04.12.2015, 19:05:36
    #39120986
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во пересечений интервалов дат, очень долгий запрос
Ну скажем
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE `connections` (
`id` SERIAL PRIMARY KEY,
`date` datetime NOT NULL,
`status` ENUM('connected', 'disconnected', 'error', 'unknown') NOT NULL,
);


Код: sql
1.
2.
3.
4.
5.
CREATE TABLE `sessions` (
`id` SERIAL PRIMARY KEY,
`start` BIGINT,
`end` BIGINT
);


и соответственно необходимые KEY, включая FOREIGN.
...
Рейтинг: 0 / 0
04.12.2015, 19:46:36
    #39121015
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во пересечений интервалов дат, очень долгий запрос
Akina,

почему start и end bigint...? что там будет?
...
Рейтинг: 0 / 0
04.12.2015, 23:47:56
    #39121146
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кол-во пересечений интервалов дат, очень долгий запрос
Alex_Ustinovпочему start и end bigint...? что там будет?
FK на connections, есссно.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Кол-во пересечений интервалов дат, очень долгий запрос / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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