如何解决MySQL 慢子查询,我应该使用 JOIN 吗?
我正在跟踪网站上发生的用户事件(登录、注销、页面加载等)。
我想运行一个查询来获取以下用户:
- 已登录
- 尚未退出
- 超过 90 分钟前未登录
在下面的示例中,我创建了一些数据,这些数据应该只返回一个带有 user_id = 3
的登录用户,因为
-
user_id 1
已退出 -
user_id 2
超时 -
user_id 3
已登录且未超时或手动退出
假设现在的时间是 2021-02-24 12:15:00
id | user_id | 描述 | created_at |
---|---|---|---|
19954 | 3 | 登录 | 2021-02-24 12:00:00 |
16085 | 1 | 退出 | 2021-02-24 12:00:00 |
11844 | 2 | 登录 | 2021-02-24 10:00:00 |
16850 | 1 | 登录 | 2021-02-24 10:00:00 |
我当前的查询是这样的,但运行速度非常慢。
SELECT DISTINCT(user_id),id,created_at
FROM events e1
WHERE id = (
SELECT id
FROM events e2
WHERE e2.user_id = e1.user_id
AND description IN ('log in','log out')
ORDER BY created_at desc
LIMIT 1
)
AND description = 'log in'
AND created_at > NOW() - INTERVAL 90 MINUTE
ORDER BY created_at desc
我的索引如下。
主要 | BTREE | 真的 | id |
description_index | BTREE | 错误 | 说明 |
user_desc_created_index | BTREE | 错误 | user_id,description,created_at |
user_id_description_index | BTREE | 错误 | user_id,描述 |
我想我可能需要连接而不是子查询,但我不确定具体如何。有人可以帮忙吗?
解决方法
您可以尝试将 joi 与 subqiery 一起用于 user_id 的最大日期组
SELECT DISTINCT user_id,id,created_at
FROM events e1
INNER JOIN (
select user_id,max(created_at) max_date
from events
WHERE description IN ('log in','log out')
group by user_id
) t1
inner join events t2 ON t1.user_id = t2.user_id and t1.max_date = t2.created_at
WHERE t2-description = 'log in'
AND t2.created_at > NOW() - INTERVAL 90 MINUTE
ORDER BY t2.created_at desc
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。