Я работаю над системой обнаружения ботов, которая помогает мне запустить ML, чтобы идентифицировать этот трафик.
Короче говоря, у меня есть две таблицы:
То, что мне нужно сделать, - это присоединиться к таблице 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
....
Вот один из способов:
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;
Ваш запрос не является SARGable. Использование функции в столбце в соединении или в тех случаях, когда условия вынуждают сканирование таблицы. Я бы предположил, что вы должны создать 2 сгенерированных/вычисленных столбца в журнале таблицы. В одном столбце будет храниться время за 1 минуту до фактического времени, а в другом столбце будет храниться время за 5 минут до этого.
После этого вы можете использовать эти два новых столбца для присоединения к таблице. Вы можете также индексировать эти 2 новых столбца, чтобы сделать поиск еще быстрее.
Хотя, этот подход увеличит стоимость вставки в журнале таблицы. Поэтому вам нужно тщательно рассмотреть этот подход.
Позвольте мне знать, если это помогает.