MySQL объединяет две таблицы с интервалом даты и времени

0

Я работаю над системой обнаружения ботов, которая помогает мне запустить ML, чтобы идентифицировать этот трафик.

Короче говоря, у меня есть две таблицы:

  1. Одна таблица содержит все данные журнала сервера (запросы до второго уровня) с столбцом datetime
  2. Одна таблица, в которой есть строка для исключительного события, которое я определил. (с столбцом datetime)

То, что мне нужно сделать, - это присоединиться к таблице 2 с 1 и получить список запросов сервера за 1 и 5 минут до каждого исключительного события.

Поэтому у меня есть две таблицы и вы хотите сделать соединение между ними и суммировать столбец запросов сервера. Критерии присоединения должны состоять в том, чтобы таблица A находилась в пределах 1 и 5 минут времени таблицы B.

Таким образом B.time <= A.time <= B.time + (1 | 5) минут

Вот код, и у меня есть индексы (btree) для обоих столбцов datetime. Но, похоже, SUPER SLOW работает. Все, что я могу сделать по-другому?

Таблица журналов имеет несколько миллионов строк, а таблица исключений - около 3000.

SELECT
    a.Name AS ExceptionName,
    SUM(b.Requests) AS Requests1MBefore,
    SUM(c.Requests) AS Requests5MBefore,
FROM exceptions a
LEFT JOIN log b
ON
    b.Datet <= a.Datet
    and a.Datet <= DATE_ADD(b.Datet, INTERVAL 1 MINUTE)
LEFT JOIN log c
ON
    c.Datet <= a.Datet
    and a.Datet <= DATE_ADD(c.Datet, INTERVAL 5 MINUTE)
GROUP BY
    a.name

Я ожидаю, что результат будет объединенной таблицей, которая выглядит так:

Exception Name | Requests1MBefore | Requests5MBefore
Event1         | 50               | 500
Event2         | 10               | 1000
....
  • 0
    Сделайте только одно JOIN в течение 5 минут и используйте условное агрегирование для столбца 1 минута.
Теги:
join

2 ответа

0

Вот один из способов:

SELECT e.Name AS ExceptionName,
       SUM( l.Datet > DATE_SUB(e.Datet, INTERVAL 1 MINUTE) as Requests1MinBefore,
       COUNT(l.Datet) as Requests5MinBefore
FROM exceptions e LEFT JOIN
     log l
     ON l.Datet <= e.Datet AND
        l.Datet > DATE_SUB(e.Datet, INTERVAL 5 MINUTE)
GROUP BY e.name;
0

Ваш запрос не является SARGable. Использование функции в столбце в соединении или в тех случаях, когда условия вынуждают сканирование таблицы. Я бы предположил, что вы должны создать 2 сгенерированных/вычисленных столбца в журнале таблицы. В одном столбце будет храниться время за 1 минуту до фактического времени, а в другом столбце будет храниться время за 5 минут до этого.

После этого вы можете использовать эти два новых столбца для присоединения к таблице. Вы можете также индексировать эти 2 новых столбца, чтобы сделать поиск еще быстрее.

Хотя, этот подход увеличит стоимость вставки в журнале таблицы. Поэтому вам нужно тщательно рассмотреть этот подход.

Позвольте мне знать, если это помогает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню