вам нужен правильный индекс в вашей таблице, чтобы соответствовать как предложению WHERE, так и Order by, чтобы помочь оптимизировать.
table index on...
events ( type, user_id, date_time )
requests ( user_id, date_time )
Я мог бы даже предложить небольшую корректировку запроса.
Измените
AND e.type IN( 3, 5, 6 )
до
WHERE e.type IN( 3, 5, 6 )
Поскольку «e.Type» основан на вашей первичной таблице запроса и не имеет ничего общего с фактическим JOIN к таблице запросов.Объединение должно представлять фактические столбцы, чтобы соответствовать между таблицами.
ПРЕДЛОЖЕНИЕ отправить сообщение на вопрос.Я мог бы предложить альтернативный вариант.Добавьте столбец в вашу пользовательскую таблицу для поля даты / времени lastRequest.Затем каждый раз, когда вводится запрос для этого пользователя, обновите поле в пользовательской таблице.Вам не нужно держать подзапрос max (), чтобы узнать когда.Это может упростить ваш запрос до чего-то вроде ... По мере того, как ваша таблица запросов увеличивается, увеличивается и время запроса.Посмотрев прямо на пользовательскую таблицу ONCE для уже известного последнего запроса, вы получите свой ответ.Запрашивать 10 тыс. Пользователей или 2 млн. Запросов ... ваш выбор для всплытия:)
select
u.user_id,
e.type,
count(*) CountPerType,
min( e.date_time ) firstEventDateAfterUsersLastRequest
from
user u
join events e
on u.user_id = e.user_id
AND e.type in ( 3, 5, 6 )
AND e.date_time > u.lastRequest
group by
u.user_id,
e.type
Таким образом, у вашего объединения уже есть базовая дата / время для пользователя, и вы можете просто искать записи, поступающие в ПОСЛЕчеловек последний раз что-то запрашивал (следовательно, последующие действия).
Затем, чтобы подготовить новый столбец в своей пользовательской таблице, вы можете просто обновить с максимальным (request.date_time) для пользователя.
Есличеловек активен по состоянию на: 27 ноября, и есть 5 ответов на 3 разных типа событий ПОСЛЕ того, что вы все равно получите этого человека на дату его 27 ноября, но у других людей могут быть более новые или более старые даты «последнего запроса».
Просто дополнительная мысль ..