【发布时间】:2020-05-21 12:03:56
【问题描述】:
我需要有关优化此计数查询的帮助。以下是表格:
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 ,并且用户不是私有的。
基本上,我想找到发生的零售活动总数以及在选定的 item_id 和选定的时间范围内执行的唯一用户总数。
所以查询将是(X 是一个整数,例如 1234 - 如果是项目,则它是 ID)
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
因为这个项目有很多活动(350k),所以运行很慢(8-25s)。有什么办法可以加快速度?
【问题讨论】:
-
这不是该查询的解释,ut_users 是什么? X 是什么?
-
@Strawberry 我刚刚更新了这个以删除这个错字并添加 X 的解释。
-
在 1:1 关系中有两个表是不寻常的——我看到它们都有
PRIMARY KEY(active_id)。请证明。 -
或者
retail_activities是一个many:many映射表?请提供SHOW CREATE TABLE;我认为你有一个错字。
标签: mysql sql optimization mariadb