MySQL объединяет две таблицы с интервалом даты и времени - PullRequest
0 голосов
/ 29 июня 2018

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

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

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

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

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

То есть B.time <= A.time <= B.time + (1 | 5) минут </p>

Вот код, и у меня есть индексы (btree) в обоих столбцах даты и времени. Но, похоже, работает СУПЕР МЕДЛЕННО. Что-нибудь, что я могу сделать по-другому?

Таблица журнала содержит несколько миллионов строк, а таблица исключений - около 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
....

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

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

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

Однако такой подход увеличит стоимость вставки в таблицу log . Поэтому вам нужно внимательно рассмотреть этот подход.

Дайте мне знать, если это поможет.

0 голосов
/ 29 июня 2018

Вот один из методов:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...