Мне нужна помощь с оптимизацией для этого запроса. Вот таблицы:
activities
- activity_id (PRIMARY)
- item_id
- user_id
- created_at
INDEX: user_id_created_at (user_id, created_at)
INDEX: item_id (item_id)
retail_activities
- activity_id (PRIMARY)
- item_id
- created_at
INDEX: item_id (activity_id, item_id)
INDEX: item_id_created (activity_id, item_id, created_at)
users
- user_id (PRIMARY)
- is_private
INDEX: user_id_private (user_id, is_private)
Цель
Я хотел бы найти количество элементов и уникальных пользователей в retail_activities
, которые произошли за диапазон дат, в котором таблица item_id
в действиях не равна item_id
в таблицах retail_activities, а пользователь не является личным.
По сути, я хочу найти общее количество операций в рознице что произошло, и общее количество уникальных пользователей, которые выполнили для выбранного item_id и выбранного диапазона времени.
Таким образом, запрос будет (X является целым числом, например, 1234 - это идентификатор, если элемент)
SELECT count(retail_activities.item_id) as total_items, count(distinct activities.user_id) as total_users
from activities
inner join retail_activities on retail_activities.activity_id = activities.activity_id
inner join users on users.user_id = activities.user_id
where users.is_private = 0 and
activities.item_id != retail_activities.item_id and retail_activities.item_id = X and
retail_activities.created_at > "2019-11-22 00:00:00"
ОБЪЯСНЕНИЕ этого запроса следующее:
1 SIMPLE retail_activities item_id_created item_id_created 5 const 812856 Using where; Using index
1 SIMPLE activities eq_ref PRIMARY PRIMARY 4 retail_activities.activity_id 1 Using where
1 SIMPLE users eq_ref PRIMARY PRIMARY 4 activities.user_id 1 Using where
Поскольку у этого элемента много действий (350 КБ), он выполняется очень медленно (8-25 с). Есть ли способ ускорить это?